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

时间:2015-11-27 05:24:11

标签: c# .net unmanaged

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

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

1 个答案:

答案 0 :(得分:1)

<\ n>在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 ++静态库来返回它们的值,但这没有用,因为它会产生相同的结果,因为无论如何都会内联常量值。

[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;
}