0

スマート カードにアクセスするには、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 ビットの両方のシステムでアプリケーションを実行する方法について誰かアドバイスしてもらえますか?

4

1 に答える 1