首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WinScard智能卡dll 32位64位兼容性

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

Stack Overflow用户
提问于 2013-10-14 02:55:50
回答 1查看 2.6K关注 0票数 0

我必须使用WinScard.dll库来访问智能卡。我有一个Java应用程序,它加载并使用这个库来访问智能卡。

32位系统:最初我们的应用程序是为32位Windows编写的。因此,下面的库接口工作得很好。

代码语言:javascript
复制
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长整数整数。因此,以下工作

代码语言:javascript
复制
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 . 

所以现在我的问题是:

代码语言:javascript
复制
Scenario 1 :
  • 64位Java
  • 64位dll ( C:\Windows\System32 32)
  • 在接口iHandle中保持长时间

获得处理程序:正确

代码语言:javascript
复制
Scenario 2 

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

  • 32位Java
  • 32位dll
  • 保持长时间

获得处理程序:不正确

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-13 07:45:03

  1. 不要为dll设置绝对路径。只需要“WinSCard.dll”,JNA就会将其解析为正确的流程。
  2. Pointer使用iHandle,根据进程的不同,这是32位或64位。还请参阅来自JNA自述的所有“使用库”链接。

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

对于WinSCard库,我实际上制作了一个跨平台JNA接口,您可以随意使用或复制,以防您也想在Linux或Mac上的pcsclite库中使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19352864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档