我有一个旧的VB6项目。现在我在vs2008和解决方案平台上将它迁移到VB.Net中我现在必须使用64位。在旧代码中,变量hContext
被声明为整数。
Dim hContext As Integer
用作:
Dim rc As Integer
dwScope = SCARD_SCOPE_USER
rc = SCardEstablishContext(dwScope, 0, 0, hContext)
当我调试代码时,hContext会产生问题。 这是因为它定义为整数(32位)。
现在的问题是“我应该为hContext使用什么数据类型”?我也使用了不同的数据类型,如Long,ULong,IntPtr ....
注意 当我调试代码时,hcontext采用4byte地址。但是在64位中,我将hContext作为IntPtr,它取决于平台,但它只显示1字节地址。我无法建立连接。
答案 0 :(得分:3)
我怀疑问题是“64位项目中SCardEstablishContext的正确签名是什么?”
C WinAPI签名如下:
LONG WINAPI SCardEstablishContext(
__in DWORD dwScope,
__in LPCVOID pvReserved1,
__in LPCVOID pvReserved2,
__out LPSCARDCONTEXT phContext
);
指针类型(“LP ...”)应为IntPtr
,LONG / DWORD类型应映射到Integer
- 这对于32位的WinAPI调用或一个64位的版本。 (在某些情况下,最好指定IntPtr
的托管结构类型而不是,并让.NET互操作性/ pinvoke自动封送所有内容。)
pinvoke.net有时很有帮助 - 请参阅pinvoke.net: SCardEstablishConnection 和*注意顶部的VB.NET签名是错误的 - 但需要注意,因为定义是有时不正确和/或不完整; - )
对于不透明的上下文值,正确的pinvoke签名是:
<DllImport("winscard.dll", SetLastError:=True)>
Public Shared Function SCardEstablishContext(
dwScope as Integer,
pvReserved1 as IntPtr,
pvReserved2 as IntPtr,
<out>() phContext as IntPtr) As Integer
End Function
快乐的编码。
答案 1 :(得分:0)
VB.Net中的整数定义为32位,即使在64位进程中运行也是如此。
来自MSDN docs:
保持有符号的32位(4字节)整数,其值范围为-2,147,483,648到2,147,483,647。
您的SCardEstablishContext()
函数可能会调用想要为32位的非托管代码。因此我会使用Integer。
由于此函数引用,您可能还必须指定x86(32位)解决方案(而不是任何CPU或x64 / 64位)。