如何使用ctypes访问返回Delphi dll中编码的自定义类型的函数?

2024-10-02 08:21:21 发布

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

我有一个德里DLL,它正在公开一个具有以下签名的函数:

Function MyFunc(ObjID : Cardinal) : TMyRec; stdcall;

如果记录是这样定义的:

^{pr2}$

现在我的问题是:如何使用Python ctypes访问MyFunc调用dll的结果?我编写了两个类来模拟这些类型

from ctypes import *
class TMyItemRec(Structure):
    _fields_ = [("ID", c_int), ("Params", POINTER(c_wchar_p))]

class TMyRec(Structure):
    _fields_ = [("Count", c_int), ("Params", POINTER(TMyItemRec))]

但当我试图像这样读取数据时:

my_dll = windll.Script

def GetMyRec(ID):
    my_dll.MyFunc.argtypes = [c_uint]
    my_dll.MyFunc.restype = TClilocRec

    return my_dll.Script_GetClilocRec(ID)

我收到访问冲突错误。在


Tags: idfieldsmyscriptparamsmyfuncctypesstructure
1条回答
网友
1楼 · 发布于 2024-10-02 08:21:21

不能将Delphi管理的类型(如动态数组)传递给非Delphi代码。不能期望用这些数据类型调用函数。在

你需要重新设计你的界面。您需要使用简单类型和包含简单类型的记录。如果需要数组,则必须传递指向第一个元素和长度的指针,而不是使用Delphi特定的托管类型。使用windowsapi作为模板来设计互操作接口。在

您需要处理的另一件事是,Delphi中函数返回值的处理方式与大多数其他Windows编译器中的处理方式不同。因此,不适合寄存器的记录将需要作为var参数而不是函数返回值来传递。在

相关问题 更多 >

    热门问题