我先说说我的思路。错误的地方帮忙指点。

要实现的功能:delphi7要调用vc写的dll,dll中参数类型为char**。
dll中的声明:
extern "C" _declspec(dllexport)  char* __stdcall  ML_I(char** arrGroupNo,char** arrMedialpm)
{
    CString strIP1=arrGroupNo[0];
    CString strIP2=arrGroupNo[1];
    CString strIP3=arrMedialpm[0];
}调用此函数时应传递指针数组。
所以在delphi中声明参数类型为:array of PChar//PChar类型为指针,是指向0结尾的字符串。
贴点代码:
arrGroupNo:array[0..1] of PChar;
arrMedialpm:array[0..1] of PChar;arrGroupNo[0]:='101.1.110.1'+char(0);
arrGroupNo[1]:='101.1.110.2'+char(0);
arrMedialpm[0]:='101.1.110.136'+char(0);
arrMedialpa[0]:='101.1.110.137'+char(0);问题:
测试dll时,strIP1,strIP正确。strIP3报错:访问错误。

解决方案 »

  1.   

    strIP1和strIP2正确。strIP3错误。求解答。
      

  2.   

    arrMedialpm[0]:='101.1.110.136'+char(0);
    arrMedialpa[0]:='101.1.110.137'+char(0);
    你确定调用ML_I的时候, arrMedialpm还有效吗, 即内存没有有被释放掉.或者你传入的指针是否正确?提示是地址访问错误,  你可以在dll中的 ML_I 函数中输出 指针值看看指针是否合法.
      

  3.   

    1.arrMedialpm有效。在delphi中调试时,可以看到传入值。
    2. char **p=NULL;
    p=arrMedialpm; 得到p为0x00000001 应该也是合法的了吧。
    还有别的可能吗?
      

  4.   

    extern "C" _declspec(dllexport)  char* __stdcall  ML_I(char** arrGroupNo,char** arrMedialpm)
    这个你在Delphi里是怎么声明的?
      

  5.   

    function ML_I(arrGroupNo:Array of PChar;arrMedialpm:Array of PChar):PChar;  stdcall;external 'MLClient.dll';
      

  6.   

    函数参数声明为开放数组,Delphi编译器会隐含传入数组上界,这样C++ DLL中的函数取参数就错了。这样就可以了:
    type
      PPCharArray = ^TPCharArray;
      TPCharArray = array[0..255] of PChar;function ML_I(arrGroupNo, arrMedialpm: PPCharArray): PChar; stdcall external 'MLClient.dll'; 
      

  7.   

    那实参改怎么声明呢?也是PPCharArray ?实参为PPCharArray 时,编译错误啊
      

  8.   

    修改之后的:  type PPCharArray= ^TPCharArray;
      TPCharArray = array[0..255] of PChar;
      function ML_I(arrGroupNo:PPCharArray;arrMedialpm:PPCharArray;arrMedialpa:
      PPCharArray;n:Integer;disk:PChar):PChar;  stdcall;external 'MLClient.dll';
      arrGroupNo:PPCharArray;//array[0..1] of PChar;
      arrMedialpm:PPCharArray;//array[0..1] of PChar;
      arrGroupNo[0]:='101.1.110.1'+char(0);
      arrGroupNo[1]:='101.1.110.2'+char(0);
      arrMedialpm[0]:='101.1.110.136'+char(0);
      arrMedialpm[1]:='101.1.110.137'+char(0);
    但是调试dll时直接访问错误啊:
      

  9.   

    你这样使用的话,
    arrGroupNo:PPCharArray;//array[0..1] of PChar;
    arrMedialpm:PPCharArray;//array[0..1] of PChar;
    这两个变量传入之前分配空间了吗?你应该这样使用:
    arrGroupNo:TPCharArray;
    arrMedialpm:TPCharArray;
    ML_I(@arrGroupNo, @arrMedialpm, ...);我测试了一下,按照你给出的C声明写了一个DLL,用Delphi调用是正常的。