我必须使用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界面中保留Long
处理程序获得:正确
Scenario 2
(在64位系统上运行,但使用32位工件):
32位Java VM
32位dll
Keep Long
获得处理程序:不正确
不应该由WOW64子系统自动处理方案2。我读到WOW64会自动转换数据结构,以便32位应用程序可以在64位系统上运行。
有人可以建议我如何让我的应用程序在32和32上运行64位系统无需每次都更改iHandle的接口?
答案 0 :(得分:1)
Pointer
,根据进程,可以是32位或64位。另请参阅JNA readme。还要考虑使用JNAerator,它会自动从标头中创建JNA接口。如果你可以让它工作,它可以节省你很多时间。
对于WinSCard库,我实际上制作了一个cross-platform JNA interface,您可以随意使用或复制,以防您也想在Linux或Mac上使用pcsclite库。