【发布时间】:2013-10-21 14:00:14
【问题描述】:
我必须使用 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)
在iHandle界面中保持Long
处理程序获得:正确
Scenario 2
(在 64 位系统上运行但使用 32 位工件):
32 位 Java 虚拟机
32 位 dll
保持较长时间
处理程序获得:不正确
不应该由 WOW64 子系统自动处理场景 2 吗?我读到 WOW64 会自动转换数据结构,以便 32 位应用程序可以在 64 位系统上运行。
有人可以建议我如何让我的应用程序在 32 位和 64 位系统上运行,而无需每次都更改 iHandle 的界面吗?
【问题讨论】:
标签: java windows dll 32bit-64bit winscard