###前提・実現したいこと
あるハードウェアを制御する為のDLLをPythonから制御しようとしています。
環境はPython3.6.0b1(Win32),Windows10(32ビット)です。
DLL内には、そのパソコンに接続されている機器の一覧を取得する関数と、
機器をオープンする関数、実際に機器に対して何かしらの制御を行う関数があります。
DLL内の関数は以下の様に定義されています。
EXPORT BOOL __stdcall Get_Device_Handle( DWORD *num, UINT64 *dFoundHandle );
EXPORT BOOL __stdcall Open_Handle( UINT64 dFoundHandle, UINT64 *dOpenHandle );
###発生している問題・エラーメッセージ
ValueError: Procedure probably called with not enough arguments (4 bytes missing)
###該当のソースコード
num = c_ulong(); FoundHandle = ( c_ulonglong * 16 )(); dOpenHandle = c_ulonglong(); if dll.Get_Device_Handle( byref( num ), byref( FoundHandle )) == False: print("Device not found!!"); sys.exit(1); else: print('Device %d found!!' % num.value ); for i in range( num.value ): このfor文の中で見つかった機器を順番にオープン→制御→クローズする if dll.Open_Handle( FoundHandle[i], byref( dOpenHandle )) == False: ←ここでエラーが発生する print("OPEN Failed!!"); sys.exit(1); dOpenHandleを使って何かしらの制御 ここでオープンしたデバイスをクローズしてfor文の先頭に戻る
###試したこと
違う環境や違う開発環境で試してみた。
Open_Hanlde()でエラーがでていますが、
実際にはGet_Device_Handle()でFoundHandleに正しい値を受け取れていないのではないかと考えています。
Get_Device_Handle()は、パソコンに接続されている機器の台数(最大16台)とそのハンドル(FoundHandle)が帰って来て、
そのFoundHandleを使いOpen_Handle()で機器をオープンします。
###補足情報(言語/FW/ツール等のバージョンなど)
1,同じ環境(Win10/32ビット)で当該DLLをVC2015から制御すると機器をオープンして制御する事ができました。
2,違う環境(Win7/64ビット+Python3.6.0b1(Win64)+64ビット版DLL)でVC2015から制御すると機器をオープンして制御する事ができました。
3,違う環境(Win7/64ビット+Python3.6.0b1(Win64)+64ビット版DLL)でPythonから制御すると機器をオープンして制御する事ができました。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/01 13:13
2017/06/01 13:29
2017/06/01 13:38