从 C# 调用非托管代码并使用已知常量检查返回值

Calling Unmanaged Code from C# and Checking Returned Value with Known Constants

在用 C# 编写的目标平台 .NET 3.5 的 DLL 中,我将使用 CMP_WaitNoPendingInstallEvents 非托管函数。如文档中所述,此方法 returns WAIT_OBJECT_0WAIT_TIMEOUTWAIT_FAILED 值在 winbase.h[=20= 中定义] 文件。我需要从 C# 检查这个 return 值并采取行动。

如何将 returned 值与 C# 中 winbase.h 中定义的常量进行比较?

在winnt.h

#define STATUS_WAIT_0       ((DWORD)0x00000000L) 

在winbase.h

#define WAIT_OBJECT_0       ((STATUS_WAIT_0 ) + 0 )
#define WAIT_FAILED         ((DWORD)0xFFFFFFFF)

并在 winerror.h

#define WAIT_TIMEOUT        258L    // dderror

你应该自己定义这些常量。要直接使用 windows 头文件中的常量,您可以实现一个 C++ 静态库来 return 它们的值,但这没有用,因为它会产生相同的结果,因为常量值无论如何都会被内联.

[DllImport("cfgmgr32.dll", SetLastError = true, EntryPoint = "CMP_WaitNoPendingInstallEvents", CharSet = CharSet.Auto)]
public static extern uint CMP_WaitNoPendingInstallEvents(uint TimeOut);

private const uint WAIT_OBJECT_0 = 0x0;
private const uint WAIT_TIMEOUT = 0x102;
private const uint WAIT_FAILED = 0xFFFFFFFF;

那么 PInvoke 应该:

uint result = CMP_WaitNoPendingInstallEvents(1000);
switch (result)
{
    case WAIT_OBJECT_0:
        break;
    case WAIT_TIMEOUT:
        break;
    case WAIT_FAILED:
        break;
}