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;
}
あなたのヘルプは大歓迎です。
ありがとう:
は
cdecl
を使用するには、このようなあなたのライブラリーを作成します。 – sks