从 C# 调用非托管代码并使用已知常量检查返回值
Calling Unmanaged Code from C# and Checking Returned Value with Known Constants
在用 C# 编写的目标平台 .NET 3.5 的 DLL 中,我将使用 CMP_WaitNoPendingInstallEvents 非托管函数。如文档中所述,此方法 returns WAIT_OBJECT_0
、WAIT_TIMEOUT
和 WAIT_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;
}
在用 C# 编写的目标平台 .NET 3.5 的 DLL 中,我将使用 CMP_WaitNoPendingInstallEvents 非托管函数。如文档中所述,此方法 returns WAIT_OBJECT_0
、WAIT_TIMEOUT
和 WAIT_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;
}