我试图在从python转换的delphiXE2中访问DLL。
以下是python程序的摘录:
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
from ctypes import *
from os.path import dirname, join
_dir = dirname(__file__)
try:
mylib = cdll.LoadLibrary(join(_dir, "myAPI.dll"))
except:
print "myAPI.dll not loaded"
const0 = 0
const1 = 1
def libCalculation(data):
""" generic calculation fonction
"""
cr = mylib.libCalculation(c_char_p(data))
return cr
def function1(p1, p2, p3, p4, value=const1):
cr = mylib.function1(
c_double(p1), c_double(p2),
c_double(p3), c_double(p4),
c_int(value)
)
return cr
我尝试将调用转换为delphi中的function1,如下所示:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
const
const0 = 0;
const1 = 1;
function function1(p1,p2,p3,p4:double; v:integer):double;stdcall; external 'myAPI.dll';
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var p1,p2,p3,p4,temp:double;
v:integer;
begin
p1:=43.1;
p2:=5.3;
p3:=43.5;
p4:=6.1;
v:=const1;
temp:=function1(p1,p2,p3,p4,v);
edit1.Text:=floattostrf(temp,fffixed,8,3);
end;
end.
在dll中正确找到该函数,但是我收到执行错误: " ..浮点堆栈检查"。
我的转换是否正确?我能错过什么?与使用的类型相关的任何事情(double,integer)?我尝试了不同的类型但没有成功......
libCalculation(数据)函数对我来说也是一个谜。如何在Delphi中转换?
欢迎任何帮助。 谢谢
答案 0 :(得分:3)
Python代码使用cdll
,因此调用约定为cdecl
。此外,c_int
默认情况下返回类型为ctypes
,但您使用了double
。这种不匹配解释了运行时错误。
所以Delphi应该是:
function function1(p1,p2,p3,p4: double; v: integer): integer; cdecl; external 'myAPI.dll';
对于另一个函数,它需要一个指向以null结尾的8位字符数组的指针,并返回整数:
function libCalculation(p: PAnsiChar): integer; cdecl; external 'myAPI.dll';