2013-10-14 128 views
0

我必須利用WinScard.dll庫來訪問智能卡。我有一個Java應用程序加載並使用這個庫來訪問智能卡。WinScard智能卡dll 32位64位兼容性

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應用程序,我們意識到,要使它發揮作用,我們需要做的int所有iHandle長這一翻譯。因此,下面的作品

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

處理程序獲得:正確

​​

(64位的系統上運行,但使用32個僞影):

  • 32位Java VM

  • 32位DLL

  • Keep Long

處理程序獲得:不正確

不應在場景2被照顧自動WOW64子系統。我讀過WOW64自動轉換數據結構,以便32位應用程序可以在64位系統上運行。

有人可以告訴我如何讓我的應用程序在32位的32位的32位的32位系統上運行,而不需要每次都改變iHandle的接口嗎?

回答

1
  1. 不要爲dll設置絕對路徑。只需要「WinSCard.dll」,JNA就會將其解析爲正確的流程。
  2. 對於iHandle使用Pointer,這取決於進程是32位還是64位。另請參閱JNA readme中的所有「使用庫」鏈接。

還可以考慮使用JNAerator,它會自動從頭創建JNA接口。如果你能使它工作,它可以爲你節省很多時間。

對於WinSCard庫,我實際上製作了一個cross-platform JNA interface,您可以隨意使用或複製,以防您也想將它與Linux或Mac上的pcsclite庫一起使用。

+0

非常感謝。這看起來非常有希望。當我從當前時間開始計時時,我會立即檢查它。 – rockstar

+0

THANKs我能解決我的不兼容問題:-) – rockstar