我调用vc的dll,函数为:function Readxx(CertLen:PInteger;Cert:string):integer;s
tdcall;external'SSK.DLL' name 'Readxx';调用过程为:
var
ptr : pinteger;
Rootl:string;
begin
   RootLen:=0;//私有变量
   setlength(Rootl,1000);
   ptr:=@RootLen;
   ret:=Readxx(ptr,Rootl);
end;调用的时候老是有异常出现,说指针无效,我刚学delphi大家给看看是哪个地方不对.

解决方案 »

  1.   

    在implementation下面有没有申明这个DLL函数?
      

  2.   

    你是不是必须用那个 PInteger,而且你用 VC 写的 DLL,是怎么处理 DELPHI 中的 String 的,为什么不用 PChar 呢?
      

  3.   

    to Nizvoo(会点Pascal):extern "C" int __stdcall Readxx(int *CLen, unsigned char *Cert)
      

  4.   

    CloneCenter:我想不是string的原因,可能是那个整形指针的问题
      

  5.   

    是啊,我也碰到了这样的问题,dll还是在delphi下做的,就是调试不过来,郁闷
      

  6.   

    extern "C" int __stdcall Readxx(int *CLen, unsigned char *Cert)CLen对应传一个整形批针就行了,你为什么要取一个字符串的地址给它呢。Cert传一个PCHAE类型或者简单一点申明一个字符数组传进去就行了var aa:array [0..100] of char数组下标一定从0开始就行了
      

  7.   

    int __stdcall Readxx(int *CLen, unsigned char *Cert)
    unsigned char
    对应pascal是: Byte,而是stringfunction Readxx(cLen: PInteger; Cert: PByte): Integer; stdcall;但指针是一样的,所以可以写成:
    function Readxx(cLen: PInteger; Cert: PChar): Integer; stdcall;
    or
    function Readxx(cLen: PChar; Cert: PChar): Integer; stdcall;
    or
    function Readxx(cLen, Cert: PChar): Integer; stdcall;
    or
    function Readxx(cLen, Cert: Pointer): Integer; stdcall;但用的时候,要转成对应的,如PInteger, PByte, PChar之类就行了。
      

  8.   

    没声明这个DLL,到www.playicq.com看看,有一篇VC和D的连接文章
      

  9.   

    haha,我也碰到过。见意不要用指针,你的SDK我这里有。我也走了不少弯路,现在终于明白了...............
      

  10.   

    如果要把非空串string类型的S的内容作为字符指针来读取,那么指针应为
    @S[1]
    而不是@S
    因为S仅保存的是指向一个内存块的指针,而指向的内存块中存储的才是串的内容。
      

  11.   

    lance09(lance.&Scott):把SDK发过来让我看看,谢谢。
    [email protected]