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

use*_*880 9 python delphi dll ctypes

我试图从DLL中调用函数,这似乎是在Delphi中创建的.DLL支持的一些函数的示例是:

function oziDeleteWpByName(var name:pansichar):integer;stdcall
Run Code Online (Sandbox Code Playgroud)

我为访问上述函数而编写的Python代码不起作用.

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

pi = pointer(name)

delname = libc.oziDeleteWpByName

delname(name)
Run Code Online (Sandbox Code Playgroud)

我似乎将错误的数据类型传递给函数.关于如何做到这一点的任何想法?

谢谢它的工作.现在请帮助这个功能:

function oziGetOziVersion(var Version:pansichar; var DataLength:integer):integer; stdcall; OziExplorer的版本在Version变量中返回.

现在我如何传递'var version',它也将被返回.

yak*_*yak 12

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))
Run Code Online (Sandbox Code Playgroud)


Mas*_*ler 1

在Delphi 中,var参数是通过引用传递的。所以你拥有的是一个指向 a 的指针PAnsiChar(又名 C 风格字符串指针)。如果您向它传递一个字符串指针,而不是指向字符串指针的指针,它将不起作用。

  • @Warren 不,LaKraven 是对的。`cdll` 与 `windll` 是指定调用约定的方式。此外,没有用于调用约定的 Windows 标准,至少在 x86 上是这样。有些库使用“stdcall”,有些库使用“cdecl”。以 msvcrt 为例。都是“cdecl”。 (2认同)