スマート カードにアクセスするには、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 ではなく long にする必要があることに気付きました。したがって、次の作品
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
キープロング
取得したハンドラー: 正しくありません
シナリオ 2 は、WOW64 サブシステムによって自動的に処理されるべきではありません。WOW64 はデータ構造を自動的に変換して、32 ビット アプリケーションを 64 ビット システムで実行できるようにすることを読みました。
毎回 iHandle のインターフェイスを変更する必要なく、32 ビットと 64 ビットの両方のシステムでアプリケーションを実行する方法について誰かアドバイスしてもらえますか?