请教个问题,在Delphi调用C写的DLL函数时,函数中有可变参数,
例如:int add(int a, ...);
在Delphi中如何向其正确传递参数?可以假设参数都为整数

解决方案 »

  1.   

    a : array of Integer;
      

  2.   

    这种方法是不行的,因为只传递的是数组的地址,而实际上在C中是根据传递参数的个数push参数到堆栈中
      

  3.   

    delphi有一个关键字:varargs专门用于可变参数处理的,我的一个测试:
    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);会清栈,所以不会出错