Python将指针传递给Delphi函数
Posted
技术标签:
【中文标题】Python将指针传递给Delphi函数【英文标题】:Python pass Pointer to Delphi function 【发布时间】:2013-04-02 13:09:11 【问题描述】:我有在 Delphi 中构建的 dll,我尝试从中调用函数。函数声明如下:
function GetUid(UID:Pointer):Integer; stdcall;
这相当于这个 C 函数签名:
int GetUID(void *pointer);
使用 ctypes 处理的库:
from ctypes import *
lib = cdll.LoadLibrary("mylib.dll")
但我卡在这里:
res = lib.GetUid(?)
我需要在这个函数中传递什么? 指针是void *,但是如何在python中正确地做到这一点?
【问题讨论】:
如果我是你,我会使用c_void_p
。
你需要展示GetUID
的实现。返回值可能表示成功或其他。 UID
参数可能意味着指向调用者声明的UID
数据类型。但是没有代码我们怎么知道呢?
@TLama Er,但你要指出什么?无论如何,byref()
的可能性更大
使用windll
代替cdll
来匹配stdcall
调用约定。
你应该传递给函数的 DLL 文档 say 是什么?首先弄清楚这一点,然后然后担心如何在 Python 中表示指向此类事物的指针。
【参考方案1】:
Python 是一种高级语言。您通常不会从 C 或 Pascal 本机库中导入 DLL 并调用它并将变量从 Python 传递到 C 或 Pascal 函数,该函数采用 void *
类型的原始指针,然后以这种方式操作原始内存。
简而言之,如果您知道自己在做什么,那么您会比尝试做您在这里做的事情更清楚。
假设你的实现是这样的:
function GetUid(UID:Pointer):Integer; stdcall;
var
P2:^Integer;
begin
P2 := UID;
P2^ := 0;
end;
然后,您要做的是将地址传递给 32 位整数。当然,我上面的例子是荒谬的,因为上面的意义是将参数声明为“int *pointer”(用 C 术语)而不是“void *pointer”。
无论你在做什么,接下来可能发生的事情是你会破坏你的 python 解释器的堆,并导致很多有趣的崩溃和错误。
更明智的方法是阅读有关编写可以操作原生 Python 类型 (PyObject) 的 C 扩展的 Python 文档,并且如果您愿意,可以使用 pascal 执行相同的操作。
p4d 似乎是一种在 delphi 中编写扩展 DLL 的可行方法:
https://code.google.com/p/python4delphi/source/list
【讨论】:
没有。我不同意。使用 ctypes 比在本机代码中编写扩展要轻得多。如果提问者只是告诉我们函数的期望,那么这个问题就很容易回答了。以上是关于Python将指针传递给Delphi函数的主要内容,如果未能解决你的问题,请参考以下文章
Python & Ctypes:将结构作为指针传递给函数以获取数据
SWIG:将 Python 字符串传递给 void 指针类型的参数