我必须使用 WinScard.dll 库来访问智能卡。我有一个 Java 应用程序,它加载并使用该库来访问智能卡。
32 位系统:最初我们的应用程序是为 32 位 Windows 编写的。因此,以下库接口(interface)运行良好。
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 位 Windows 时,我们意识到要使其正常工作,我们需要将所有 iHandle 设为 long 而不是 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 )
在界面iHandle中保持Long
获得的处理程序:正确
Scenario 2
(在 64 位系统上运行但使用 32 位工件):
32 位 Java 虚拟机
32位dll
保持长期
获取的处理程序:不正确
场景2不应该由WOW64子系统自动处理吗?我读到 WOW64 会自动转换数据结构,以便 32 位应用程序可以在 64 位系统上运行。
有人可以建议我如何让我的应用程序在 32 位和 64 位系统上运行,而无需每次都更改 iHandle 的界面吗?
最佳答案
- 不要为 dll 设置绝对路径。只需需要“WinSCard.dll”,JNA 就会将其解析为该进程的正确名称。
- 对 iHandle 使用
指针
,该指针可以是 32 位,也可以是 64 位,具体取决于进程。另请参阅 JNA readme 中的所有“使用库”链接。 .
还可以考虑使用JNAerator ,它会自动从 header 创建 JNA 接口(interface)。如果你能让它工作,它可以节省你很多时间。
对于WinSCard库,我实际上做了一个cross-platform JNA interface如果您还想在 Linux 或 Mac 上将其与 pcsclite 库一起使用,您可以随意使用或复制它。
关于java - WinScard 智能卡 dll 32 位 64 位兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19352864/