Board logo

Subject: C++定长参数填充与Delphi的PPChar [Print This Page]

Author: rarnu    Time: 2009-4-10 17:24     Subject: C++定长参数填充与Delphi的PPChar

在用C++调用Delphi的DLL时,常有数组参数的问题发生。而C++要向Delphi传入数组似乎也不那么方便,于是特地写下此函数,只要规定了每个参数的长度,即可以将数组传入Delphi的DLL中。

在此,我将数组内每个元素的长度规定为256

函数代码如下:

[Copy to clipboard]
CODE:
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的参数了

[Copy to clipboard]
CODE:
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", &params, 3);

上面的代码中,callScript即是从Delphi输出的函数,然后看一下Delphi端如何处理接收到的参数:

[Copy to clipboard]
CODE:
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,并获得其中的内容以便下一步操作的使用。
Author: zzzl    Time: 2009-4-18 18:39

不想看代码,直接告诉我原理吧




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0