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中的DLL函数

Python & Ctypes:将结构作为指针传递给函数以获取数据

SWIG:将 Python 字符串传递给 void 指针类型的参数

在 C++ 中创建对象并将指针传递给 python

C++ 将指针传递给函数 (Howto) + C++ 指针操作

将对象的方法指针传递给接受[静态方法指针/全局函数]指针的函数