HRESULT在C++和C#之间的转换

本文关键字:之间 转换 C++ HRESULT | 更新日期: 2023-09-27 18:26:20

我有C++代码,它是使用反射等从C#调用的。

我遇到的奇怪的事情是,在C++端,函数声明看起来像这个

dppFUNC(HRESULT) dppOnlineGetBalanceInfo(

在C#端,它被声明为

[DllImport("dppClientModule.dll", CallingConvention = CallingConvention.StdCall)]
private static extern UInt32 dppOnlineGetBalanceInfo(

为什么C#代码上的返回类型是uint?不应该是int吗?

它会引起什么问题?它现在已经被这样使用了,我想知道它会引起什么问题?

作为重复的链接问题似乎有所不同,因为在接受的答案中,MAKEHRESULT(C#版本)的结果是int,为什么?

HRESULT在C++和C#之间的转换

HRESULT在C/C++中被定义为一个长(32位有符号)。因此,从技术上讲,在C#中,您将使用int。这也是微软自己在C#中使用的Exception.HResult.类型

使用int而不是uint的缺点是,在禁用溢出检查(unchecked)的同时,必须显式强制转换MSDN文档中列出的所有常量:

例如:

const int E_FAIL = 0x80004005;

无法将类型"uint"隐式转换为"int"。存在显式转换(是否缺少强制转换?)

添加显式强制转换:

const int E_FAIL = (int)0x80004005;

常量值"2147500037"无法转换为"int"(使用"unchecked"语法覆盖)

现在,您有三个选项:

const int E_FAIL = ‭-2147467259‬;
const int E_FAIL = unchecked((int)0x80004005);
const uint E_FAIL = 0x80004005;

使用负值无助于提高内容的可读性。因此,要么将所有常数定义为unchecked((int)...),要么将HRESULT视为uint