Java WinScard智能卡dll 32位64位兼容性

Java WinScard智能卡dll 32位64位兼容性,java,windows,dll,32bit-64bit,winscard,Java,Windows,Dll,32bit 64bit,Winscard,我必须使用WinScard.dll库来访问智能卡。我有一个Java应用程序,它加载并利用这个库访问智能卡 32位系统:最初我们的应用程序是为32位Windows编写的。因此,以下库接口工作良好 SCard INSTANCE = (SCard)Native.loadLibrary("C:\\Windows\\SysWOW64\\WinSCard.dll", SCard.class); public int SCardEstablishContext(int iScope, Pointer

我必须使用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位windows时,我们意识到要使其正常工作,我们需要将所有iHandle long intead设置为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中保持长时间

获得的处理程序:正确

Scenario 2 
(在64位系统上运行,但使用32位工件):

  • 32位Java虚拟机

  • 32位动态链接库

  • 久留

获取的处理程序:不正确

场景2不应该由WOW64子系统自动处理吗。我了解到WOW64自动转换数据结构,以便32位应用程序可以在64位系统上运行

有人能告诉我如何让我的应用程序在32位和64位系统上运行,而无需每次更改iHandle的接口吗

  • 不要为dll设置绝对路径。只需要“WinSCard.dll”,JNA就会将其解析为进程的正确版本
  • 对iHandle使用
    指针
    ,根据进程的不同,指针可以是32位或64位。另请参见中的所有“使用库”链接
  • 也考虑使用,它自动从标题中创建JNA接口。如果你能让它工作,它可以节省你很多时间


    对于WinSCard库,我实际上制作了一个可供您随意使用或复制的文件,以防您还想将其与Linux或Mac上的pcsclite库一起使用。

    非常感谢。这看起来确实很有希望。当我从当前计划中退出时,我将尽快检查它。谢谢,我能够解决我的不兼容问题:-)