0

我有在 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 中正确地做到这一点?

4

1 回答 1

0

Python 是一种高级语言。您通常不会从 C 或 Pascal 本机库中导入 DLL 并调用它并将 Python 中的变量传递给采用void *原始类型指针的 C 或 Pascal 函数,然后以这种方式操作原始内存。

简而言之,如果你知道你在做什么,你会比尝试做你在这里做的事情更清楚。

假设您的实现是这样的:

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
于 2013-04-02T22:15:13.693 回答