VC写的动态库 一个参数定义成
“char * params[]”delphi中该如何定义?才能正确的调用。有经验的朋友应该一看就知道。
因为好久没有来泡坛了。所以放100分吧。来者有分。
int DllExport PersonalizeCard (long CardNumber, int nargs, char * params[])
如果成功会在C:下写ookk.txt文件 
感兴趣的朋友可以通过下面地址下载DLL 试验一下。http://ys-h.ys168.com/ys168up/D1/?dll.rary72z7ld4f9f9b1f8z95b4b4b7b0b1b1fq9b4b2b7fl9fl6e14z97e14e24b1b2f2b1fl9b4fc6fd7z

解决方案 »

  1.   

    params : array of char
      

  2.   

    type
    c=array of PChar;int DllExport PersonalizeCard (long CardNumber, int nargs, params c)
      

  3.   

    谢谢大家支持!如方便请大家下载后调用一下。
    然后把程序贴出来。to:hongqi162(失踪的月亮) 
    我试了一下,没成功。
    相信你应该能搞定。赶快出手吧。
      

  4.   

    个人认为char * params[]是一个字符指针数组,不应该理解为array of char,而应该理解为array[low..high] of string或TstringList类。本人初学,对概念的理解可能较肤浅,高手勿笑
      

  5.   

    二楼array of pchar应该是最精确的理解了
      

  6.   

    用PCharfunction PersonalizeCard (CardNumber: Cardinal;  nargs: Integer; params: PChar): Integer; 对应是array of PChar,我觉得C里面有种调用方式是...,意思是说可以写入很多参数的那种,感觉params差不多。
    LZ这样一试:
    var
      Buffer: array [0..10, 0..1024] of Char;
    begin
      //buffer赋值
      PersonalizeCard (no, 10, @Buffer);
    end;dll弄不下来,不弄了。
      

  7.   

    楼上的有道理,不过后面要加stdcall; external dllname等,否则还是错误的.总之,那个参数是个指针就行了,至于怎样用,要看情况,输出和输入指针可有不同的处理
      

  8.   

    谢谢大家的支持,根据大家的思路早上我又试了一次还是不行。
    百思不的其解呀!to:maozefa(阿发伯) 压栈方式已经检查过了stdcall。
    三个参数都是入参。不好意思,上面的下载地址过期了,下面是新的百分百好用。
    http://blog.chinaunix.net/upfile/061201092335.rar
      

  9.   

    char * params[]等价char** params
    char*p 等价 pchar(delphi)
      

  10.   

    谢谢大家的支持!
    我开了一个空间把DLL 传上去了。地址http://free.ys168.com/?goodok 的“软件下载”目录下的dll.rar 文件。希望高手出面解决这个问题
      

  11.   

    这个,还是用pointer就可以了用的时候定义一个array of char 数组就可以了!
      

  12.   

    最好把array的参数定义成record来传
      

  13.   

    类型严格对应的DELPHI声明是
      params: PPChar;
    定义成 
      params: Array of PChar; 也可以的,
    Array of PChar可以强制转换成PPChar不出问题,
    但反过来转换不行的.
    感觉楼主问题不在这儿.
    看楼主的DLL C声明中,并没有声明__stdcall,
    那为什么DELPHI声明中要用stdcall? DELPHI声明对应的应该是cdecl
      

  14.   

    string是Pascal特有的类型,不能直接兼容PCharchar * params[]
    看成一个PChar的数组,就是array of PCharfunction PersonalizeCard (
              CardNumber: Integer;
              nargs: Integer;
              params: PPChar
              ): Integer; stdcall;procedure TForm1.Button1Click(Sender: TObject);
    var
      vParams: array[0..1] of PChar;
    begin
      vParams[0] := 'Zswang';
      vParams[1] := '到此一游';
      PersonalizeCard(1, 2, @vParams[0]);
    end;你提供的Demo无法调试,缺少Mfc42d.dll、MSVCRTD.DLL
    只有你自己调试了
      

  15.   

    关于array of char 与PPCHAR 类型转换,可以看下面代码验证其可行.
    //---------------------------------------------------------------procedure test(params : ppchar);//这儿用的PPChar类型,严格对应char* params[];
    begin
      ShowMessage(params^);
      inc(params);
      ShowMessage(params^);
    end;type
      ttest2 = procedure(params: array of pchar);
    procedure TForm1.Button1Click(Sender: TObject);
    var
      s: array of pchar;
      p: ttest2;
    begin
      setlength(s,2);
      s[0] := '1234151';
      s[1] := 'abc';
      p := ttest2(@test);//函数转换,四字节指针赋值而已.
      p(s); //参数使用array of ppchar 方式调用procedure test
    end;
      

  16.   

    char * params[]在一般的C++编译器(Bcb、VC)是不能通过编译的,因为C++中不允许定义动态数组(C++的动态数组应该通过堆内存分配才行),但如果这样就不会错:char * params[]={“china”,“French”,“Japan”};
    char * params[]的准确含义应该是动态字符指针数组,在delphi中与array of PChar等价。
      

  17.   

    谢谢大家帮忙!虽然现在还没有调通但问题应该不是参数定义的问题了。通过讨论对c与delphi的类型有了更多的认识。