我正在使用ctypes将visualc++6应用程序移植到python。 它使用相同的windows库dll。我只是将windows窗体移植到python应用程序中。
当我用python将cpp结构发送到dll时,我感到很困惑。
我试着在结构上找到解决办法。在cpp代码中,有一个struct tagging(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);
}
=======================Python部分==========================
^{pr2}$修订历史
===================结果=============================
在应用@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)
第四个字符不匹配
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应该是:
我看到的第二件事是,您正在发送一个指向CSMessage函数的指针的指针。在
你能试试:
^{pr2}$第三个问题不那么严重,这是字符串
"TESTSTRING"
不能容纳8个字节。在我看到的第四个问题是,默认参数的类型是错误的。在
试试这个:
相关问题 更多 >
编程相关推荐