[英]is there struct tagging conventions in python ctypes.Structure?
我正在使用ctypes将Visual c ++ 6应用程序移植到python。 它使用相同的Windows库dll。 而且我只将Windows窗体移植到python应用程序。
当我在python中将cpp结构发送到dll时卡住了。
我试图在结构差异上找到解决方案。 从cpp代码中,有一个结构标记(tagTest),但python代码中没有等效的标记。 有什么解决办法吗?
这是我要从中移植的cpp。
======================= cpp零件========================= ========
BOOL CSMessage(HWND hWnd, const char* string1, const char* string2, const char* ltagTest, int structlen);
typedef struct tagTest
{
char item1 [ 8]; char _item1;
char item2 [ 1]; char _item2;
} TcTest, *LPTest;
void Initiator()
{
TcTest ctest ={0};
memset(&ctest,0x20,sizeof TcTest);
move(ctest.item1,"TESTSTRI");
move(ctest.item2,"1");
mhandler.CSMessage(GetSafeHwnd(),"String","Call",(char*)&ctest,sizeof TcTest);
}
======================== pythonpart ========================= ====
csMessageProto=ctypes.WINFUNCTYPE(BOOL, HWND, c_char_p, c_char_p, c_char_p, c_int)
csMessageParams=((1,"hWnd",0),(1,"string1",0),(1,"string2",0),(1,"ltagTest",0),(1,"structlen",0))
CSMessage=csMessageProto(("CSMessage",testDll), csMessageParams)
class tagTest(ctypes.Structure):
_fields_ = [
('item1', c_char*8),('_item1', c_char),
('item2', c_char*1),('_item2', c_char)
]
PtagTest=ctypes.POINTER(tagTest)
utestblock=tagTest()
utestblock.item1=str("TESTSTRI")
utestblock.item2=str(1)
CSMessage(hwnd, "String", "Call", ctypes.byref(utestblock), ctypes.sizeof(utestblock));
修订记录
====================结果============================ ==
应用@avl_sweden的建议后,经过测试,错误消息是这个。
ctypes.ArgumentError: argument 4: <type 'exceptions.TypeError'>: wrong type
和类型
print "Is Type : "+str(ctypes.byref(utestblock))
Is Type : <cparam 'P' (023e5968)>
================================================== =======
所以看起来类型在def和instance上是不同的。
在python代码的第一行
1: csMessageProto=ctypes.WINFUNCTYPE(BOOL, HWND, c_char_p, c_char_p, c_char_p, c_int)
第四个c_char_p不匹配
16: CSMessage(hwnd, "String", "Call", ctypes.byref(utestblock), ctypes.sizeof(utestblock));
匹配差异。
我将代码更改为
1: csMessageProto=ctypes.WINFUNCTYPE(BOOL, HWND, c_char_p, PtagTest, c_char_p, c_int)
并且代码没有返回错误。 但我找不到它是否通过发送。 因为没有从DLL返回。
您认为这是正确的解决方案吗?
================================================== ==================================
我已经过测试,看来这是正确的解决方案。
再次感谢你。
我发现这里有四件事是错误的:
首先,您的python结构体定义与C代码片段中的定义不匹配。 python一个应该是:
class tagTest(ctypes.Structure):
_fields_ = [
('item1', c_char*8), ('_item1',c_char),
('item2', c_char*1), ('_item2',c_char)
]
我看到的第二件事是,您正在发送一个指向CSMessage函数的指针的指针。
您可以尝试:
utestblock=tagTest()
utestblock.item1=str("TESTSTRI")
utestblock.item2=str(1)
loadeddll.CSMessage(hwnd, "String", "Call", ctypes.byref(utestblock),
ctypes.sizeof(utestblock))
第三个问题不太严重,这是因为字符串"TESTSTRING"
不适合8个字节。
我看到的第四个问题是默认参数的类型错误。
尝试以下方法:
csMessageParams=((1, "hWnd", 0), (1, "string1", ""), (1, "string2", ""),
(1, "ltagTest", ""), (1, "structlen", 0))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.