CnPack Forum


 
Subject: C++定长参数填充与Delphi的PPChar
rarnu (橙子)
灌水部部长
Rank: 8Rank: 8


UID 2689
Digest Posts 11
Credits 648
Posts 209
点点分 648
Reading Access 10
Registered 2006-10-2
Status Offline
Post at 2009-4-10 17:24  Profile | Site | Blog | P.M. 
C++定长参数填充与Delphi的PPChar

在用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", &params, 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,并获得其中的内容以便下一步操作的使用。




Rarnu
CnPack Interfacer
rarnu@cnpack.org
Top
zzzl (早安的空气)
版主
Rank: 7Rank: 7Rank: 7



UID 590
Digest Posts 0
Credits 399
Posts 199
点点分 399
Reading Access 100
Registered 2004-11-29
Status Offline
Post at 2009-4-18 18:39  Profile | Blog | P.M.  | QQ
不想看代码,直接告诉我原理吧
Top
 




All times are GMT++8, the time now is 2024-11-22 01:38

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.007903 second(s), 7 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP