Миграция в VB.NET: какой тип данных использовать для hcontext в проекте x64? - PullRequest
1 голос
/ 08 ноября 2011

У меня есть старый проект VB6. Теперь я переношу его в VB.Net на vs2008 и на платформу решения. Теперь мне нужно использовать 64 бита. В старом коде переменная hContext была объявлена ​​как Integer.

 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 берет 4-байтовый адрес. Но в 64-битном я беру hContext как IntPtr, который зависит от платформы, но он показывает только 1-байтовый адрес. И я не могу установить соединение.

Ответы [ 2 ]

3 голосов
/ 08 ноября 2011

Я подозреваю, что вопрос «что такое правильная подпись для SCardEstablishContext в 64-битном проекте?»

Сигнатура C WinAPI выглядит следующим образом:

LONG WINAPI SCardEstablishContext(
  __in   DWORD dwScope,
  __in   LPCVOID pvReserved1,
  __in   LPCVOID pvReserved2,
  __out  LPSCARDCONTEXT phContext
);

Типы указателей ("LP ...") должны быть IntPtr, а типы LONG / DWORD должны соответствовать Integer - это будет правильно для вызова WinAPI в 32-разрядном или 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

Счастливое кодирование.

0 голосов
/ 08 ноября 2011

Целое число в VB.Net определяется как 32-битное, даже при работе в 64-битном процессе.

Из документов MSDN :

Содержит 32-разрядные (4-байтовые) целые числа со знаком, значения которых варьируются от -2 147 483 648 до 2 147 483 647.

Ваша функция SCardEstablishContext(), скорее всего, вызывает неуправляемый код, который хочет быть 32-битным. Поэтому я бы использовал Integer.

Возможно, вам также придется указать x86 (32-битное) решение (а не Any CPU или x64 / 64bit) из-за этой ссылки на функцию.

...