【问题标题】:WinScard Smart Card dll 32 bit 64 bit compatibilityWinScard 智能卡 dll 32 位 64 位兼容性
【发布时间】: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


    【解决方案1】:
    1. 不要为 dll 设置绝对路径。只需要“WinSCard.dll”,JNA 就会将其解析为适合该进程的正确文件。
    2. 为 iHandle 使用 Pointer,根据进程的不同,它是 32 位或 64 位。另请参阅JNA readme 中的所有“使用库”链接。

    还可以考虑使用JNAerator,它会自动从标头生成 JNA 接口。如果你可以让它工作,它可以为你节省很多时间。

    对于 WinSCard 库,我实际上制作了一个 cross-platform JNA interface,您可以随意使用或复制它,以防您还想在 Linux 或 Mac 上将其与 pcsclite 库一起使用。

    【讨论】:

    • 非常感谢。这看起来肯定很有前途。当我从当前的日程安排中抽出时间时,我会尽快查看。
    • 感谢我能够解决我的不兼容问题 :-)
    猜你喜欢
    • 2023-03-30
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2019-08-19
    • 2016-02-28
    • 2010-11-27
    • 2022-01-20
    相关资源
    最近更新 更多