HRESULT,DWORD和HANDLE在非托管代码中的含义是什么?

use*_*049 -1 c# clr unmanaged language-interoperability marshalling

我正在读关于Marshaling的事.我很困惑,因为在非托管代码中这意味着什么.HRESULT,DWORD和HANDLE.原文是:

您已经知道托管和非托管环境之间没有这种兼容性.换句话说,.NET不包含存在于非托管代码领域中的类型HRESULT,DWORD和HANDLE.因此,您需要找到.NET替代品或根据需要创建自己的替代品.这就是所谓的编组.

AMi*_*ico 8

简答:

它只是告诉您必须将一种编程语言中使用的一种数据类型"映射"为另一种编程语言中使用的另一种数据类型,并且数据类型必须匹配.

快速回答:

对于这个,细节可能不正确,但概念是.

这些是C/C++的Windows头文件中定义的一些数据类型.它们是"宏",它将C/C++的原始数据类型"抽象"为Windows编程中使用的更有意义的数据类型.例如,DWORD在C/C++中实际上是一个32位无符号整数,但在64位处理器上,它在头文件中定义为64位无符号整数.这个想法是在处理器所需的数据类型和语言使用的数据类型之间提供一个抽象层.

在编组期间,此"dword"将转换为DllImport声明中指定的CLR数据类型.这是一个重点.

假设您要调用带有DWORD参数的Windows API方法.在C#中声明此调用时DllImport,必须将参数数据类型指定为System.UInt32.如果你不这样做,"坏事就会发生".

例如,如果您错误地将参数数据类型指定为System.UInt64.当进行实际调用时,堆栈将变得损坏,因为堆栈上放置了更多字节,然后API调用期望.这可能导致完全意外的行为,例如崩溃应用程序,崩溃Windows,无效的返回值等等.

这就是具体确定正确数据类型的重要原因.

有问题的数据类型:

  • DWORD定义为32位无符号整数或CLR类型System.UInt32.
  • 手柄的CLR类型IntPtr,UintPtrHandleRef
  • HRESULT是System.Int32System.UInt32

参考文献: