我正在读关于Marshaling的事。我很困惑,因为在非托管代码中这意味着什么。 HRESULT,DWORD和HANDLE。 原文如下:
您已经知道托管和非托管环境之间没有这种兼容性。换句话说,.NET不包含存在于非托管代码领域中的类型HRESULT,DWORD和HANDLE。因此,您需要找到.NET替代品或根据需要创建自己的替代品。这就是所谓的编组。
答案 0 :(得分:8)
它只是告诉您必须将一种编程语言中使用的一种数据类型“映射”为另一种编程语言中使用的另一种数据类型,并且数据类型必须匹配。
对于这个,细节可能不正确,但概念是。
这些是C / C ++的Windows头文件中定义的一些数据类型。它们是“宏”,它将C / C ++的原始数据类型“抽象”为Windows编程中使用的更有意义的数据类型。例如,DWORD
实际上是C / C ++中的32位无符号整数,但在64位处理器上,它在头文件中定义为64位无符号整数。我们的想法是在处理器所需的数据类型和语言使用的数据类型之间提供一个抽象层。
在编组期间,此“dword”将转换为{strong>您在DllImport
声明中指定的CLR数据类型。 这是一个重点。
假设您要调用带有DWORD
参数的Windows API方法。使用DllImport
在C#中声明此调用时,必须将参数数据类型指定为System.UInt32
。如果你不这样做,“会发生坏事。”
例如,如果您错误地将参数数据类型指定为System.UInt64
。当进行实际调用时,堆栈将变得损坏,因为堆栈上放置了更多字节,然后API调用期望。这可能导致完全意外的行为,例如崩溃应用程序,崩溃Windows,无效的返回值等等。
这就是具体确定正确数据类型的重要原因。
System.UInt32
。IntPtr
,UintPtr
或HandleRef
System.Int32
或System.UInt32
使用P / Invoke调用托管类中的非托管API 在http://msdn.microsoft.com/en-us/library/aa719104(v=vs.71).aspx有一个表,其中列出了Windows数据类型及其对应的CLR数据类型,专门回答了您的问题
Windows数据类型(Windows) http://msdn.microsoft.com/en-us/library/aa383751(v=VS.85).aspx
.NET专栏:使用P / Invoke 在http://msdn.microsoft.com/en-us/magazine/cc164123.aspx
答案 1 :(得分:3)
HRESULT:http://en.wikipedia.org/wiki/HRESULT
在计算机编程领域,HRESULT是一种使用的数据类型 在Windows操作系统和早期的IBM / Microsoft OS / 2中 操作系统,用于表示错误情况和警告 条件。 HRESULTs的最初目的是正式布局 公共和Microsoft内部使用的错误代码范围 为了防止不同的错误代码之间的冲突 OS / 2操作系统的子系统。 HRESULT是数值误差 码。 HRESULT中的各个位编码有关的信息 错误代码的性质,以及它来自何处。 HRESULT错误代码 在COM编程中最常遇到的是它们形成的 标准化COM错误处理约定的基础。
DWORD:http://en.wikipedia.org/wiki/DWORD#Size_families
HANDLE:http://en.wikipedia.org/wiki/Handle_(computing)
在计算机编程中,句柄是对a的抽象引用 资源。应用程序软件引用块时使用句柄 由另一个系统管理的内存或对象,例如数据库或 一个操作系统。虽然指针字面上包含地址 它引用的项目,句柄是引用的抽象 这是外部管理;它的不透明性允许指示物 系统重新定位在内存中而不会使句柄失效, 指针是不可能的。额外的间接层也 增加管理系统对操作的控制 在指示物上进行。通常,句柄是索引或 指向全局墓碑数组的指针。
答案 2 :(得分:0)
HRESULT
,DWORD
和HANDLE
是typedef
(即,它们代表普通数据类型),由Microsoft定义,供程序员编译* un * managed使用Windows环境中的代码。它们在Microsoft提供的C(或C ++)头文件中定义,该文件通常自动包含在Microsoft Visual Studio中创建的非托管Windows项目中。