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

2024-09-30 22:14:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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}$

修订历史

  1. 添加了cpp和python的dll函数声明
  2. 用@avl_瑞典建议修订

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

在应用@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没有返回。

你认为这是正确的解决办法吗?

=============================================================================================

我已经测试过了,这似乎是正确的解决方案。

再次感谢你。


Tags: 代码ctypescppintbooldllcharitem1
1条回答
网友
1楼 · 发布于 2024-09-30 22:14:06

我认为这里有四个错误:

首先,您的python结构定义与C代码片段中的不匹配。python应该是:

class tagTest(ctypes.Structure):
    _fields_ = [
        ('item1', c_char*8), ('_item1',c_char),
        ('item2', c_char*1), ('_item2',c_char)
    ]

我看到的第二件事是,您正在发送一个指向CSMessage函数的指针的指针。在

你能试试:

^{pr2}$

第三个问题不那么严重,这是字符串"TESTSTRING"不能容纳8个字节。在

我看到的第四个问题是,默认参数的类型是错误的。在

试试这个:

csMessageParams=((1, "hWnd", 0), (1, "string1", ""), (1, "string2", ""),
                 (1, "ltagTest", ""), (1, "structlen", 0))

相关问题 更多 >