質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2180閲覧

Python で winscard.dll を使用して、カードリーダーを認識したい

dayjirou123

総合スコア1

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/08/20 07:17

編集2021/08/20 07:58

前提・実現したいこと

Python で winscard.dll を使用して、
カードリーダーの認識をしたいです。

別のプログラムでは、カードリーダーは認識できています。

SCardListReadersA で

0が返ってくればよいはずなのですが、
-2146435026
が返ってきてしまいます。

引数の渡してるものがおかしいのかとも思うのですが、
何を渡せば正しいのかがわかりません。

以下該当のソースコード

Python

1import ctypes 2 3def con_text(): 4 handle = ctypes.c_void_p() 5 ret = lib.SCardEstablishContext(0, None, None, ctypes.pointer(handle)) 6 7 8 print(ret) 9 return handle 10 11def ListReaders(handle): 12 13 pcchReaders = 256 14 mszReaders = "" 15 ret = lib.SCardListReadersA(handle, ctypes.c_wchar_p(""), ctypes.c_wchar_p(mszReaders), 16 ctypes.c_wchar_p(pcchReaders)) 17 18 print(ret) 19 20lib = ctypes.WinDLL("WinScard") 21ListReaders(con_text())

試したこと

SCardListReadersAをSCardListReadersWにしてみましたが、0は返ってきませんでした。

補足情報(FW/ツールのバージョンなど)

PyCharm で開発しています。

カードリーダーはSONYのRC-S380です。
HPKIカードに接続しようとしています。

Pythonでのプログラムは初めてなので、初歩的なところがおかしいかもしれません。
また、投稿も初めてなのでおかしいとことがあったらすみません。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

https://docs.python.org/3/library/ctypes.html

Specifying the required argument types (function prototypes)

Return types

を参照しながら引数や戻り値の型を明示した方が良いと思います。明示しないとunsigned intがintになっったりと、数値の暗黙変換でctypes を使ったコードが意図した通りに動かないという問題に引っかかりやすくなると思います。(体験談)

投稿2021/08/20 12:39

YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dayjirou123

2021/08/31 14:15 編集

返信が大変遅くなり申し訳ありません。 アドバイスいただきましてありがとうございました。 頂いたアドバイスをもとに、 型指定をしてやってみたのですがうまくいきませんでした。 ```Python # -*- coding: utf-8 -*- import sys import ctypes from ctypes import * import typing as tp def main(): #WinsCardを使用する # lib = ctypes.WinDLL("WinScard") #WinsCardの関数の型を指定する SetTypes() #接続確認 con_text() print(type(hcontext)) # ListReaders(hcontext) def SetTypes(): # SCardEstablishContext lib.SCardEstablishContext.argtypes = (ctypes.c_long, ctypes.c_long, ctypes.c_long, ctypes.POINTER(ctypes.c_long)) lib.SCardEstablishContext.restype = ctypes.c_long # SCardListReaders lib.SCardListReadersA.argtypes = (ctypes.POINTER(ctypes.c_long), ctypes.POINTER(ctypes.c_char) ,ctypes.POINTER(ctypes.c_char), ctypes.POINTER(ctypes.c_long)) def SCardListReaders(hContext, mzGroup, ReaderList, pcchReaders): result = lib.SCardListReadersA(hContext, mzGroup, ReaderList, pcchReaders) return result def con_text(): print("con:" + str(type(hcontext))) ret = lib.SCardEstablishContext(0, 0, 0, ctypes.POINTER(hcontext)) print(ret) return hcontext def ListReaders(hcontext): pcchReaders = 256 ret = SCardListReaders(hcontext, None, None, ctypes.c_wchar_p(pcchReaders)) print(hcontext) print(ret) """""" ### main """""" SCARD_SCOPE_USER = c_long hcontext = ctypes.POINTER(ctypes.c_long) lib = ctypes.WinDLL("WinScard") print(type(hcontext)) main() ``` ctypes.ArgumentError: argument 4: <class 'TypeError'>: expected LP_c_long instance instead of _ctypes.PyCPointerType というエラーが出てしまいます。 print("con:" + str(type(hcontext))) としたところでは、 con:<class '_ctypes.PyCPointerType'> となっているので、型はあっている気がするのですが、エラーになってしまいます。 何がおかしいのでしょうか。 再度アドバイスいただけると幸いです。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問