Я пытаюсь использовать dll в исходном коде Python, используя ctypes. Я начал читать это из документации Python, поскольку я новичок в этом. После успешной загрузки DLL в Python, когда я пытаюсь передать строку в функцию, которая ожидает char *
, он дает мне
"ValueError: процедура, вероятно, вызвана со слишком большим количеством аргументов (4
избыточных байт) ".
Я также пытался просмотреть другие сообщения, но не смог решить проблему.
Я пробовал разные подходы к передаче этой строки, такие как 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 реализован в файле cpp, который доступен в dll export,
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;
}
Ваша помощь очень ценится.