Я должен использовать библиотеку 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?