HRESULT、DWORD 和 HANDLE 在非托管代码中是啥意思?

Posted

技术标签:

【中文标题】HRESULT、DWORD 和 HANDLE 在非托管代码中是啥意思?【英文标题】:What do HRESULT, DWORD, and HANDLE mean in unmanaged code?HRESULT、DWORD 和 HANDLE 在非托管代码中是什么意思? 【发布时间】:2013-01-04 04:14:19 【问题描述】:

我正在阅读有关编组的内容。我很困惑,因为在非托管代码中这意味着什么。 HRESULT、DWORD 和 HANDLE。 原文为:

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

【问题讨论】:

你可以用谷歌来做这个... 一个没有经验的程序员可能不明白如何解释这样的搜索的谷歌结果。在我看来,一个简单的问题值得快速回答,以帮助该用户和其他人。 这是我给的。我觉得***的描述很容易理解,你的答案也是如此。只是不完全确定这是 SO 的问题,可能是错误的 @AMissico:发帖者至少应该尝试提问。未显示任何尝试。 @MitchWheat 我同意 AMissico 的观点。除非您绝对确定,否则请给张贴者带来怀疑的好处。在我看来,*** 的最大缺陷是高声望的成员会被鼓励不恰当地评判他人。我经常目睹这一点,这让我担心网站的质量最终会因此而下降。 【参考方案1】:

简短回答:

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

快速回答:

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

这些是在 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。 HANDLE 是 CLR 类型 IntPtrUintPtrHandleRef HRESULT 是 System.Int32System.UInt32

参考资料:

使用 P/Invoke 从您的托管类调用非托管 APIhttp://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 专栏:在 C# 中使用 P/Invoke 调用 Win32 DLL http://msdn.microsoft.com/en-us/magazine/cc164123.aspx

【讨论】:

@TimothyP,谢谢。第一次做 P/Invoke 时,我遇到了同样的问题。【参考方案2】:

HRESULT:http://en.wikipedia.org/wiki/HRESULT

在计算机编程领域,HRESULT 是一种使用的数据类型 在 Windows 操作系统和更早的 IBM/Microsoft OS/2 操作系统,用于表示错误情况和警告 条件。 HRESULT 的最初目的是正式布局 公共和 Microsoft 内部使用的错误代码范围 为了防止不同的错误代码之间的冲突 OS/2 操作系统的子系统。 HRESULT 是数值错误 代码。 HRESULT 中的各个位对有关 错误代码的性质,以及它的来源。 HRESULT 错误代码 在 COM 编程中最常见,它们形成 标准化 COM 错误处理约定的基础。

双字:http://en.wikipedia.org/wiki/DWORD#Size_families

句柄:http://en.wikipedia.org/wiki/Handle_(computing)

在计算机编程中,句柄是对 资源。应用程序软件引用块时使用句柄 由另一个系统管理的内存或对象,例如数据库或 一个操作系统。而指针字面上包含的地址 它所引用的项目,句柄是引用的抽象 由外部管理;它的不透明度允许所指对象 在不使句柄无效的情况下由系统重新定位到内存中, 指针是不可能的。额外的间接层也 增加管理系统对操作的控制 在参照物上执行。通常,句柄是索引或 指向全局墓碑数组的指针。

【讨论】:

@AMissico 请让其他人来决定它是否真的在回答这个问题。您的第一条评论 “HANDLE 错误” 很有用且有效。第二个 - 不是那么多。我注意到您自己提供了一个很好的答案,然后对其他两个答案都投了反对票。像 TimothyP 对您的答案投赞成票一样,投赞成票是另一回事。 @DanNissenbaum,你是对的。当人们在标题中提出问题并且没有在正文中重述问题时,我有时会错过他们的“标题问题”。后来我注意到 TimothyP 确实回答了标题中提到的问题。然而,我并没有改变我的反对意见,因为总的来说,我觉得他的回答没有任何价值,因为它只是链接和引用。【参考方案3】:

HRESULTDWORDHANDLE 是由 Microsoft 定义的 typedef(即它们代表纯数据类型),供程序员在 Windows 环境中编译 *un* 托管代码时使用。它们在 Microsoft 提供的 C(或 C++)头文件中定义,通常自动包含在 Microsoft Visual Studio 中创建的非托管 Windows 项目中。

【讨论】:

-1,太相信,不肯定,不知道的不要回答,看faq。 @AMissico - 我说“我相信,我不积极”的项目都在第二段,次要问题的目的,而不是中心答案。如果我没有时间研究次要问题,我是否应该不回答发帖人的问题?当我不确定某事时,我会明确说明,并且在每种情况下都是关于次要问题。对于主要观点,我是绝对正确和肯定的。您投反对票是在不考虑这些重要细节的情况下快速反应的一个例子。 自己提供答案(一个很好的答案 - 感谢您抽出宝贵时间),然后对其他人的更快速的反应投反对票,这很粗鲁。 另一方面,@AMissico,我同意您的 cmets 在上述讨论中对 MitchWheat 的回应;谢谢。 (第二段现已删除)

以上是关于HRESULT、DWORD 和 HANDLE 在非托管代码中是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

编译时出错 - 从DWORD转换为LPCVOID

检查进程是否运行

转换为C ++ CLI托管对象引用的本机指针?

在操作系统中,进程之间是如何通信的

启动/停止服务

学习笔记(三)