在用C++调用Delphi的DLL时,常有数组参数的问题发生。而C++要向Delphi传入数组似乎也不那么方便,于是特地写下此函数,只要规定了每个参数的长度,即可以将数组传入Delphi的DLL中。
在此,我将数组内每个元素的长度规定为256
函数代码如下:
void CharToParam(char* param, int paramCount, ...){
va_list arglist;
va_start(arglist, paramCount);
for(int i=0; i<paramCount; i++){
char* x1 = va_arg(arglist, char*);
for(int j=0; j<strlen(x1); j++){
param[i*256+j] = x1[j];
}
}
}
有了此函数后,就可以在C++的代码中拼装出要传给Delphi的参数了
char* params = new char[256 * 3];
char* p1 = params;
char* sec = "Cfg";
char* pa1 = "pa1";
char* df1 = "1";
CharToParam(p1, 3, sec, pa1, df1);
char* ret1 = callScript("ReadCfg", ¶ms, 3);
上面的代码中,callScript即是从Delphi输出的函数,然后看一下Delphi端如何处理接收到的参数:
function ScriptCallFunction(const Name: PChar; Params: PPChar; ParamsCount: Integer): PChar; stdcall;
var
v: array of Variant;
vCall: Variant;
p:PChar;
i: Integer;
begin
SetLength(v, ParamsCount);
if ParamsCount > 0 then
begin
P := Params^;
i:=0;
v[i] := string(P);
for I := 1 to ParamsCount - 1 do
begin
Inc(P, 256);
v[i] := string(P);
end;
end;
vCall := VarArrayOf(v);
end;
通过这种方式,Delphi端就能够接到C++传来的PPChar,并获得其中的内容以便下一步操作的使用。