2011-11-09 11 views
0

ctypesを使用してPythonソースでdllを使用しようとしています。私はこれを初めて知ったので、Pythonのドキュメントから読み始めました。成功したPythonでDLLをロードした後、私はchar *を期待する関数に文字列を渡すしようとすると、それは私にPythonでdllの関数呼び出しのchar * argに文字列を渡すことができません

"ValueError: Procedure probably called with too many arguments (4 bytes in excess)".

を与える私はまた、他の記事を見ているが、問題を解決できませんでした試みました。

byref()pointer()を使用するなど、この文字列を異なる方法で試しましたが、結果は変わりませんでした。私もWINFUNCTYPEで試したが失敗した。私が使用しているDLLはwindllです。

ここに私はPythonで書いたテストプログラムです:

from ctypes import * 

lpDLL=WinDLL("C:\some_path\myDll.dll") 
print lpDLL 

IP_ADDR = create_string_buffer('192.168.100.228') 
#IP_ADDR = "192.168.100.228" 
#IP_ADDR = c_char_p("192.168.100.228") 

print IP_ADDR, IP_ADDR.value 

D_Init=lpDLL.D_Init 
D_InitTester=lpDLL.D_InitTester 

#D_InitTesterPrototype = WINFUNCTYPE(c_int, c_char_p) 
#D_InitTesterParamFlags = ((1, "ipAddress", None),) 
#D_InitTester = d_InitTesterPrototype(("D_InitTester", lpDLL), D_InitTesterParamFlags) 

try: 
    D_Init() 
    D_InitTester("192.168.100.254") 
except ValueError, msg: 
    print "Init_Tester Failed" 
    print msg 

はここD_InitTesterは、DLLの輸出で利用可能であるのcppファイルに実装されている方法です、

D_API int D_InitTester(char *ipAddress) 
{ 
    int err = ERR_OK; 

    if (LibsInitialized) 
    { 
     ... 
     some code; 
     ... 

     else 
     { 
      err = hndl->ConInit(ipAddress); 
     } 

     if (0 < err) 
     { 
      err = ERR_NO_CONNECTION; 
     } 
     else 
     { 
     nTesters = 1; 
      InstantiateAnalysisClasses(); 
      InitializeTesterSettings(); 
      if(NULL != hndl->hndlFm) 
      { 
       FmInitialized = true; 
      } 
     } 
    } 
    else 
    { 
     err = ERR_NOT_INITIALIZED; 
    } 
    return err; 
} 

あなたのヘルプは大歓迎です。

答えて

2

ほとんどの場合、エラーの原因は呼び出し規約の不一致です。私はcdecl慣習であなたのC++ DLL輸出関数を推測していますが、WinDLLの使用はstdcallを意味します。 CDLLに変更多くは、私のために働いた

lpDLL=CDLL("C:\some_path\myDll.dll") 
+0

ありがとう:

cdeclを使用するには、このようなあなたのライブラリーを作成します。 – sks

関連する問題