Python可以调用DLL中的Delphi函数吗?

10 投票
2 回答
3277 浏览
提问于 2025-04-17 09:51

我正在尝试调用一个看起来是用Delphi创建的DLL里的函数。这个DLL支持的一些函数示例如下:

function oziDeleteWpByName(var name:pansichar):integer;stdcall

我写的Python代码用来访问这些函数,但没有成功。

from ctypes import *
libc = cdll.OziAPI
name ='test'

pi = pointer(name)

delname = libc.oziDeleteWpByName

delname(name)

看起来我传给函数的数据类型不对。有没有什么建议可以让我正确地传递数据?

谢谢,问题解决了。现在请帮我看看这个函数:

function oziGetOziVersion(var Version:pansichar;var DataLength:integer):integer;stdcall; 这个函数会把OziExplorer的版本返回到Version变量里。

那么我该怎么传递'var version'呢,因为它也是要返回的那个变量。

2 个回答

1

在Delphi中,var参数是通过引用传递的。这意味着你传递的是一个指向PAnsiChar的指针(也就是C语言风格的字符串指针)。如果你传递的是一个字符串指针,而不是指向字符串指针的指针,那就不行了。

13

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。比如,有人可能会在使用某个功能时,发现它并没有按照预期工作,这时候就需要去查找原因。

通常,我们可以在网上找到很多资源,比如论坛、文档或者问答网站,像StackOverflow就是一个很好的地方。在这里,很多有经验的程序员会分享他们的经验和解决方案,帮助新手解决问题。

当你在StackOverflow上看到一个问题时,通常会有很多人提供不同的答案和建议。你可以根据这些信息来找到适合自己的解决方案。记得多看看别人的回答,学习他们的思路和方法,这样可以帮助你更快地掌握编程技巧。

总之,不要害怕遇到问题,积极寻求帮助和学习,编程的路上总会有很多人愿意分享他们的知识。

from ctypes import *

# Not strictly needed but it's good to be explicit.
windll.OziAPI.oziDeleteWpByName.argtypes = [POINTER(c_char_p)]
windll.OziAPI.oziDeleteWpByName.restype = c_int

p = c_char_p('test')
retval = windll.OziAPI.oziDeleteWpByName(byref(p))

撰写回答