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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Q&A

解決済

1回答

2269閲覧

C言語のDLLをpython(ctypes)で読み込む

p_pp

総合スコア17

Python 3.x

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

0グッド

0クリップ

投稿2019/08/04 05:42

編集2019/08/05 04:16

現在、Python からCライブラリを利用することができるctypesを利用して.dllを読み込み、測定装置からデータを読み込むプログラムの作成をしています。

C

1//ドライバアクセス用API 2//Visual C++/CLI 用モジュール 3 4// 連続取り込み設定用構造体宣言 5[StructLayout(LayoutKind::Sequential)] value struct adsms_setting 6//struct adsms_setting 7{ 8 unsigned char ChLen; //チャンネル長 1-16 9 [MarshalAs(UnmanagedType::ByValArray, SizeConst = 16)] 10 array<unsigned char> ^ ChPattern; 11 [MarshalAs(UnmanagedType::ByValArray, SizeConst = 16)] 12 array<unsigned char> ^ ChPatternRange; 13 unsigned char TriggerType; //トリガ種類 1:ソフト 2:外部ディジタル立上り 3:外部ディジタル立下り 4:立上エッジ 5:立下エッジ 6:上限レベル 7:下限レベル 14 short TriggerLevel; //エッジやレベルの閾値 15 unsigned char TriggerCh; //エッジやレベルを検出するチャンネル位置(パターンバッファのポインタ) 16 unsigned char ClockSel; //0:内部クロック 1:外部クロック 17 int SamplingClock; //内部クロック間隔 10~16,777,215[uS] 18 int PreTriggerLen; //プレトリガ長 0~10,000,000 19 int TotalLen; //全取込データバッファ 1~10,000,000

このようなCで書かれた構造体をctypesを使って書き換え、値を入力しました。

python

1import ctypes 2from ctypes import* 3"""構造体宣言""" 4class ADSMS_SETTING(Structure): 5 _fields_ = [ 6 ("ChLen",c_ubyte), 7 ("ChPattern", c_ubyte*3), 8 ("ChPatternRange", c_ubyte*3), 9 ("TriggerTypes",c_ubyte), 10 ("TriggerLevel",c_short), 11 ("TriggerCh",c_ubyte), 12 ("ClockSel",c_ubyte), 13 ("SamplingClock",c_int), 14 ("PreTriggerLen",c_int), 15 ("TotalLen",c_int)] 16adsms=ADSMS_SETTING() 17adsms.ChLen=1 18adsms.ChPattern[0]=0 19adsms.ChPatternRange[0]=0 20adsms.TriggerTypes=1 21adsms.TriggerLevel=100 22adsms.TriggerCh=0 23adsms.ClockSel=0 24adsms.SamplingClock=100 25adsms.PreTriggerLen=0 26adsms.TotalLen=9000 27

実際に関数を呼び出し、構造体を引数として動かしたところ、pythonでのエラーは起きませんでしたが、各機能関数(プロシージャ)から戻る処理結果コードでは、「指定パラメータのエラー」という戻り値がきます。おそらく構造体が間違っていると思うのですが...

つたない文章で分かりにくいとは思いますが、何卒よろしくお願いいたします

追記

C++

1 //保存先ファイル名の取得 2 SaveFileDialog1->OverwritePrompt = true; 3 SaveFileDialog1->Filter = "データファイル(*.dat)|*.dat"; 4 if( SaveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK ) 5 { 6 if( System::IO::File::Exists(SaveFileDialog1->FileName))//既存ファイルチェック 7 { 8 System::IO::File::Delete(SaveFileDialog1->FileName); 9 } 10 11 SaveFile = gcnew StreamWriter(SaveFileDialog1->FileName);//ファイルを開く 12 ret = Tusbadsms_Sample_Start((short) IdSel->SelectedIndex,smpl_setting); 13 if( ret == 0 )//正常にスタートできた 14 { 15 StopReq = false; 16 TotalLeng = 0; 17 EnableDisableControl(2); 18 Timer1->Interval = 100; 19 Timer1->Enabled = true; 20 } 21 else//正常にスタートできなかった 22 { 23 SaveFile->Close(); 24 Tusbadsms_Device_Close((short) IdSel->SelectedIndex); 25 } 26 } 27 }

Tusbadsms_Sample_Startが関数となっています。

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

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

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

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

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

Zuishin

2019/08/04 06:36 編集

削除
guest

回答1

0

ベストアンサー

通常の dll ではないので、通常の方法で読み込むことはできません。.NET のマネージド dll を読み込むための環境が必要です。
Python を使うのなら IronPython など .NET 上で動くものが楽です。

投稿2019/08/04 06:38

Zuishin

総合スコア28660

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

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

p_pp

2019/08/04 07:49

オープンやクローズは行うことができ、構造体を引数としない関数を使用した時であれば測定機の値を読み込むことができました。なので、DLLは読み込めていると思われます。
Zuishin

2019/08/04 07:56

C++/CLI を読めたんですか? どこかに間違いがあるのでは?
p_pp

2019/08/04 08:12

読み込むことができました。やはり構造体にどこか間違いがあるのでしょうか?
Zuishin

2019/08/04 08:17

構造体がどうとかいう問題ではありませんね。
Zuishin

2019/08/04 08:18

これはどうしても Python で行う必要があるんですか?
fiveHundred

2019/08/04 08:37

横やりですが、ひょっとして「ネイティブのC/C++」と「C++/CLI」の記述を混在させていませんか? (呼び出せた関数は前者になっているとか。ちなみに質問文の構造体は後者です) とりあえず、読み込めた関数のソースコードを記載すると分かる人が出てくるかもしれません。
p_pp

2019/08/05 02:45

Zuishinさん そうですね。。pythonで制御したいと考えています。
Zuishin

2019/08/05 03:12

「しなければいけない」と「したい」とどっちでしょう? IronPython ではダメな理由もありますか?
fiveHundred

2019/08/05 03:25 編集

> p_ppさん 追記確認しましたが、私が言っているのは、Python側ではなく、C言語側です。
Zuishin

2019/08/05 04:25

追記されたソースは C ではなく、どう見ても C++/CLI なんですが、これが ctype を使って Python から呼び出せるという情報はどこかにありますか?
p_pp

2019/08/05 04:36 編集

http://www.turtle-ind.co.jp/04support/faq01.html 上記の会社のdllを読み込んでいるのですが... 勉強不足で申し訳ございません。URLにも載っているようにポート外の開発ツール(C,C++)でdllを読み込めているのでpythonでもいけるのでは?と考えました。 実際にUSBを刺した状態で、動かすとオープンしているという戻り値が返ってきており、USBを抜くとUSBが刺さっていないという戻り値が返ってきます。
Zuishin

2019/08/05 04:38 編集

素直に .NET を使わないと、茨の道を進むだけでその先は崖かもしれませんよ。 https://dechimal.hatenadiary.com/entry/20100322/1269291644 > C++/CLI(仕様の邦訳)は、.netからC++やその他ネイティブコードのライブラリを楽に使えるようにするためと、そのための作業を楽に行うための言語です。
Zuishin

2019/08/05 04:56

> ここでご説明する方法はサポート範囲外です。TUSB製品全てで動作はテストされておりません。下記方法での不具合には対応できませんし、御質問にもご回答できません。 このように書かれているものを、よくわかってない人が使っていいものではありません。 メーカーすらサポートできないものです。どうしても Python でなければならない理由がある場合にのみ、自分で診断できる熟練した専門家が行うものです。 あなたの言っていることは、説明書通りにしたらパソコンのケースをドライバーで分解できたので、CPU も自分で修理できるはずだ、という主張とかわりません。
p_pp

2019/08/06 01:10

その通りですね...。素直に.NETを使うことに致しました。 ご教授いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問