javax.smartcardio.* を使用して、スマート カード リーダーを備えた Java スマート カードと正常に通信する Java のプログラムがあります。APIモニターを使用すると、java.exeウィッチが実行され、実際にWinSCard winAPIを使用していることがわかりました(通信を開始するとすぐにwinscard.dllがロードされます。実際の呼び出しをまだ見つけることができませんでした)
私の問題は、WinSCard ライブラリを使用して Qt フレームワーク C++ プログラムに同じことを実装しようとしたことです。リーダーが USB に接続されてから 10 秒以内にプログラムを実行すると、すべてがうまく機能しますが、その後、リーダーは省電力状態であると思われる状態になり、数秒後に USB パイプを撃ち落とします。リーダーに接続しようとすると、Java プログラムは自動的にリーダーを「起動」しますが、私が書いた C++ はそうではなく、何が間違っているのかわかりません。
最初にSCardEstablishContext()
call でコンテキストを確立し、次にリーダーをSCardListReaders()
でリストします。これは実際にリーダーをリストする質問です。最後にSCardConnect()
接続するために呼び出しSCARD_E_NOT_READY
、スマート カード リーダーがこの「スリープ」状態にある場合はリターンを返します。
スマート カード リーダーがこの「スリープ」モードでない場合、同じコードで問題なくカードと通信できることに注意してください。
winAPI の説明には、この場合に何をすべきかについてのヒントはなく、何をすべきかの痕跡も見つかりませんでした。誰かがこれに対する解決策を知っている場合は、共有してください!