有人可以帮我理解为什么 Win32 错误代码与方法签名不匹配,以及处理此问题的正确方法是什么?
以SCardReleaseContext 为例,根据 MSDN 文档,返回类型是LONG
。根据这篇 MSDN 文章,c# 的等价物LONG
是int
. 查看 SCardReleaseContext的一些 p/invoke示例签名,返回类型也标记为int
.
但是,WinSCard 错误代码的定义与类型不匹配int
,因为该值根本不适合int
.
目前,在我的 c# 程序中,我必须将返回值和错误代码值定义为uint
. 这样我的代码就可以编译和工作了。否则,编译器会抱怨无法将值转换为 int,例如 - enum ErrorCodes : int { SCARD_E_CANCELLED = 0x80100002 }
。
我是否可以正确假设 c++ 编译器将采用值 0x80100001 (不适合 int),让它溢出,从而将值转换为一些适当的匹配负值?
另外,我是否正确地说 c# 编译器不允许编写这样的错误/错误/缺陷,并且处理这种(角落)情况的正确方法是有目的地“制动” p/invoke 签名并uint
改为使用?
编辑:
修复了最后一个链接,这有点不正确,其中的值被强制转换为DWORD
,恰好是uint
. 将链接设置为指向 Microsoft 自己的站点。