我有dll,在Delphi中构建,我尝试从中调用函数。功能声明如下:
function GetUid(UID:Pointer):Integer; stdcall;
这相当于这个C函数签名:
int GetUID(void *pointer);
使用ctypes处理的库:
from ctypes import *
lib = cdll.LoadLibrary("mylib.dll")
但我卡在这里:
res = lib.GetUid(?)
我需要通过这个功能吗? 指针无效*,但是如何在python中正确使用它?
答案 0 :(得分:0)
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 *指针”(用C语言表示)而不是“void * pointer”。
无论你正在做什么,接下来可能会发生的事情是你会破坏你的python解释器的堆,并导致很多有趣的崩溃和错误。
一个更为明智的方法是阅读Python文档,编写可以操作本机Python类型(PyObject)的C扩展,并在pascal中执行相同的操作,如果您愿意的话。
p4d似乎是在delphi中编写扩展DLL的可行方法:
https://code.google.com/p/python4delphi/source/list