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

时间:2013-10-14 02:55:51

标签: 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 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 VM

  • 64位dll(C:\ Windows \ System32)

  • 在iHandle界面中保留Long

处理程序获得:正确

Scenario 2 

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

  • 32位Java VM

  • 32位dll

  • Keep Long

获得处理程序:不正确

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

有人可以建议我如何让我的应用程序在32和32上运行64位系统无需每次都更改iHandle的接口?

1 个答案:

答案 0 :(得分:1)

  1. 不要为dll设置绝对路径。只需要“WinSCard.dll”,JNA就会将其解析为正确的过程。
  2. 对iHandle使用Pointer,根据进程,可以是32位或64位。另请参阅JNA readme
  3. 中的所有“使用图书馆”链接

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

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