gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:27:45 24 4
gpt4 key购买 nike

我有一个 Delhi 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)

我收到访问冲突错误。

最佳答案

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

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

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

关于python - 如何使用 ctypes 访问返回在 Delphi dll 中编码的自定义类型的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17285515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com