java - WinScard 智能卡 dll 32 位 64 位兼容性

标签 java windows dll 32bit-64bit winscard

我必须使用 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 的界面吗?

最佳答案

  1. 不要为 dll 设置绝对路径。只需需要“WinSCard.dll”,JNA 就会将其解析为该进程的正确名称。
  2. 对 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/

相关文章:

c++ - 减少 Windows 可执行文件的大小

java - 为什么我无法实现 Google Places API?

java - Android Studio - 无法读取首选项设置

java - 如何使用 Gradle 5.x 生成 JPA 元模型

Java看门狗监控

java在windows中删除目录

mysql - 卸载MySQL后如何设置3306端口空闲?

c++ - 从 dll 中的函数返回时堆损坏

c# - 从 Delphi 调用 .NET DLL

java - java中如何访问其他类方法中的变量