WinScard Smart Card DLL 32-битная 64-битная совместимость

Я должен использовать библиотеку WinScard.dll для доступа к смарт-карте. У меня есть приложение Java, которое загружает и использует эту библиотеку для доступа к смарт-карте.

32-битные системы: изначально наше приложение было написано для 32-битной Windows . Следовательно, следующий интерфейс к библиотеке работал хорошо.

SCard INSTANCE = (SCard)Native.loadLibrary("C:\\Windows\\SysWOW64\\WinSCard.dll", SCard.class);   

public int SCardEstablishContext(int iScope, Pointer pvReserved1, Pointer pvReserved2, /*OUT &long*/LongByReference rRdrlHandle);    

public int SCardGetStatusChangeA(int iHandle, int dwTimeout, /*IN/OUT*/SCardReaderState.ByReference rgReaderStates, int cReaders);

64-битные системы: теперь, когда мы мигрировали наше приложение для 64-битных окон, мы поняли, что для того, чтобы оно работало, нам нужно было сделать весь iHandle длинным целым числом int . Таким образом, следующие работы

SCard INSTANCE = (SCard)Native.loadLibrary("C:\\Windows\\System32\\winscard", SCard.class);

public int SCardEstablishContext(int iScope, Pointer pvReserved1, Pointer pvReserved2, /*OUT &long*/LongByReference rRdrlHandle);

public int SCardGetStatusChangeA(long iHandle, int dwTimeout, /*IN/OUT*/SCardReaderState.ByReference rgReaderStates, int cReaders);



 Note: Point of interest is the first param to the SCardGetStatusChangeA api exposed by the library . 

Итак, теперь мой вопрос заключается в следующем:

Scenario 1 :
  • 64-битная Java VM

  • 64-битная DLL ( C:\Windows\System32)

  • Держите долго в интерфейсе iHandle

Обработчик получил: Правильно

Scenario 2 

(работает в 64-битной системе, но с использованием 32-битных артефактов):

  • 32-битная Java VM

  • 32 бит DLL

  • Держать долго

Обработчик получен: неверно

Если сценарий 2 не будет автоматически реализован подсистемой WOW64. Я прочитал, что WOW64 автоматически преобразует структуры данных, чтобы 32-разрядное приложение могло работать в 64-разрядной системе.

Может кто-нибудь посоветовать мне, как заставить мое приложение работать на 32- и 64-битных системах без необходимости каждый раз менять интерфейс iHandle?

1 ответ

Решение
  1. Не устанавливайте абсолютный путь для DLL. Просто потребуйте "WinSCard.dll", и JNA разрешит его для правильного процесса.
  2. Использовать Pointer для iHandle - 32 или 64 бита в зависимости от процесса. Смотрите также все ссылки "Использование библиотеки" из файла readme JNA.

Также рассмотрите возможность использования JNAerator, который автоматически создает интерфейсы JNA из заголовков. Если вы можете заставить его работать, это может сэкономить вам много времени.

Для библиотеки WinSCard я фактически создал кроссплатформенный интерфейс JNA, который вы можете свободно использовать или копировать, если вы также хотите использовать его с библиотекой pcsclite в Linux или Mac.

Другие вопросы по тегам