[英]Can't pass a string to char * arg of function call in dll in python
我正在尝试使用ctypes在Python源代码中使用dll。 我开始从Python文档中读取它,因为我是新手。 在Python中成功加载dll之后,当我尝试将字符串传递给期望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
以下是在dll导出中可用的cpp文件中实现D_InitTester的方法,
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;
}
非常感谢您的帮助。
很可能导致错误的原因是调用约定不匹配。 我猜你的C ++ DLL导出函数与cdecl
约定,但你使用WinDLL
意味着stdcall
。
像这样创建你的库来使用cdecl
:
lpDLL=CDLL("C:\some_path\myDll.dll")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.