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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

1174閲覧

Pythonからの構造体(class)を利用したDLL利用

E.Ta

総合スコア1

DLL

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2022/09/13 08:28

編集2022/09/13 23:57

Python3.9でsystemフォルダにあるDLL(API)を参照利用するプログラムを作っています。
DLL関数を呼び出す際に構造体を利用し、その中にデータを設定して渡すのですが
固定長文字列のため、どのように渡せばいいのかわかりません。
ご指導よろしくお願いいたします。

実現したいこと

DLL関数を呼出し、DLLの機能を稼働させたいです。

発生している問題・エラーメッセージ

構造体内部の固定長文字列 [c_wchar_p * 255]に文字を設定しようとすると例外が発生し、以下のエラーとなります。

<class 'TypeError'>:("'getset_descriptor' object is not callable",):'getset_descriptor' object is not callable

該当のソースコード

python3.9

1import ctypes 2class N_Info(ctypes.Structure): 3 _fields_ = [ 4 ('iLineType',ctypes.c_uint32), 5 ('FNumber',ctypes.c_wchar_p * 255 )] 6   : 7   : 8   : 9NUMBER_INFO = N_Info() 10NUMBER_INFO.iLineType = ctypes.c_uint32(1) 11NUMBER_INFO.FNumber= ctypes.c_wchar_p(u'01234567890') # ←例外発生場所 12 13iapi = ctypes.WinDLL(r'Iapi64.dll') 14ret = iapi.IrIndiv(hnd, ctypes.pointer(NUMBER_INFO ) 15 16

試したこと

直接設定しようとしたり、ポインタとして渡そうとしてもエラーが出てしまいます。

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

python3.9
anaconda3
pycharm利用
pythonを利用開始してから半年未満です。
ご指導よろしくお願いいたします。

追記

can110さんのご指摘もあり追記いたします。

DLL仕様書より

1IrIndiv DLLの構造仕様は以下の通りです。 2int WINAPI 3IrIndiv( 4   IN UINT_PTR hnd,           5   IN NUMBER_INFO *NN_Info, 6); 7 8構造体NUMBER_INFO の使用は以下の通りです。 9typedef struct { 10int iLineType; 11char FNumber[255]; 12} NUMBER_INFO ; 13 14

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

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

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

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

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

can110

2022/09/13 08:39

呼び出したいDLL、関数、構造体についての情報(定義)を記載すると回答得られやすくなると思います。
E.Ta

2022/09/13 08:46

ありがとうございます^^ 追記いたします
guest

回答1

0

ベストアンサー

以下にて構造体の定義までは動作することが確認できました。
char配列に値をセットするときの作法がよく分からないのですが、以下のような代入でヌル終端の文字列が、確保された領域にコピーされていると想定(期待)しています。
あとは実際に呼び出して意図した結果になるかですが、動作は未検証です。

Python

1import ctypes 2 3class N_Info(ctypes.Structure): 4 _fields_ = [ 5 ('iLineType',ctypes.c_uint32), 6 ('FNumber',ctypes.c_char * 255 )] # 構造体の定義 char にあわせる 7 8NUMBER_INFO = N_Info() 9NUMBER_INFO.iLineType = ctypes.c_uint32(1) 10NUMBER_INFO.FNumber = b'01234567890' # byteのまま代入 11 12print(NUMBER_INFO.iLineType) # 1 13print(NUMBER_INFO.FNumber) # b'01234567890'

投稿2022/09/13 09:16

can110

総合スコア38352

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

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

E.Ta

2022/09/13 23:56

ありがとうございました✨ 無事に値を設定することが出来ました。 ご協力ありがとうございましたm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問