3

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

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

记录的定义如下:

type TMyRec = record
  Count : Cardinal;
  Items : array of TMyItemRec;
end;

type TMyItemRec = record
  ID : Cardinal;
  Params : array of String;
end;

现在我的问题是:如何访问 MyFunc 使用 Python ctypes 调用 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)

我收到访问冲突错误。

4

1 回答 1

5

您不能将动态数组等 Delphi 托管类型传递给非 Delphi 代码。您不能期望调用具有这些数据类型的函数。

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

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

于 2013-06-24T22:15:50.457 回答