繁体   English   中英

python ctypes.Structure中是否有结构标记约定?

[英]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));

修订记录

  1. 添加了dll函数的声明cpp和python
  2. 用@avl_sweden建议修改

====================结果============================ ==

应用@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM