迁移到VB.NET:在x64项目中用于“hcontext”的数据类型是什么?

时间:2011-11-08 06:05:38

标签: vb.net vb6 64-bit vb6-migration type-conversion

我有一个旧的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字节地址。我无法建立连接。

2 个答案:

答案 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位)。