关于调用DLL中C函数中的var_list参数的正确调用方法? 请教个问题,在Delphi调用C写的DLL函数时,函数中有可变参数,例如:int add(int a, ...);在Delphi中如何向其正确传递参数?可以假设参数都为整数 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 a : array of Integer; 这种方法是不行的,因为只传递的是数组的地址,而实际上在C中是根据传递参数的个数push参数到堆栈中 delphi有一个关键字:varargs专门用于可变参数处理的,我的一个测试:DLL程序://---------------------------------------------------------------------------#include <windows.h>#pragma argsusedint WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved){ return 1;}//---------------------------------------------------------------------------extern "C" __export int testdll(int a,...){ va_list ap; int arg; va_start(ap, a); int total =0; for(int i=0;i<a;i++) { arg = va_arg(ap,int); total += arg; } va_end(ap); return total;}调用程序:unit testdllb;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}function _testdll(a:integer):integer;cdecl;varargs;external 'dlltestp.dll';procedure TForm1.Button1Click(Sender: TObject);var e:integer;begin e:=_testdll(8,1,2,3,4,5,6,7,8); edit1.Text:=inttostr(e);end;end.要注意的是,调用方式必须是cdecl,但C的DLL可以是STDCALL方式,因为 va_end(ap);会清栈,所以不会出错 有关LED的表格 如何将一个SETUP解包再打包 主窗体onshow时判断其他窗体的查询问题! 怎么判断同时按下 Shift+Tab 关于nil 急!接口问题(IDispatch)!发分一百,只给一个人!如不够可再加! 我安装Delphi7。0时的问题,一个星期了,郁闷啊 请明白人给讲解一下 D7中,表Column的可见控制失灵?????????????????? 存储过程请教 编码最后两位加1,位数不确定 自定义控件加到控件栏
DLL程序:
//---------------------------------------------------------------------------#include <windows.h>#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
extern "C" __export int testdll(int a,...)
{
va_list ap;
int arg;
va_start(ap, a);
int total =0;
for(int i=0;i<a;i++)
{
arg = va_arg(ap,int);
total += arg;
} va_end(ap);
return total;
}
调用程序:
unit testdllb;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}function _testdll(a:integer):integer;cdecl;varargs;external 'dlltestp.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
e:integer;
begin e:=_testdll(8,1,2,3,4,5,6,7,8);
edit1.Text:=inttostr(e);end;end.要注意的是,调用方式必须是cdecl,但C的DLL可以是STDCALL方式,因为 va_end(ap);会清栈,所以不会出错