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

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

  • Держите Long в интерфейсе iHandle

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

Scenario 2 

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

  • 32-битная виртуальная машина Java

  • 32-битная dll

  • Держите долго

Получен обработчик: Неверный

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

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


person rockstar    schedule 14.10.2013    source источник


Ответы (1)


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

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

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

person yonran    schedule 13.11.2013
comment
Огромное спасибо . Это выглядит, безусловно, очень многообещающе. Я проверю это, как только у меня будет время из моего текущего расписания. - person rockstar; 19.11.2013
comment
Спасибо, я смог исправить свои проблемы с несовместимостью :-) - person rockstar; 28.11.2013