我编写了一个DLL,所有的输出函数中都使用Pchar类型,返回提示信息。
但是在有些函数中返回的提示信息正确,有些函数中返回的提示信息后有乱码出现。而且有时返回的Pchar提示信息不可访问。调用dll的程序可能是VB,VC等开发工具编写的代码。
请各位高手帮忙!

解决方案 »

  1.   

    VB,VC与Delphi的数据类型不通用!
      

  2.   

    你那个pchar是在哪里分配内存的?我的是在应用程序中分配,传入Dll后只要往里面写,返回到现在还没有错过。要是在Dll里分配的话可能就会有问题了。
      

  3.   

    应该是在应用程序中分配吧!
    我的dll中定义了var str Pchar
    在应用程序中调用前也定义了 var str Pchar
    我也不知道是怎么回事的?
      

  4.   

    我现在用的Dll导出的函数比较多,抄一部分吧。要不你给我个邮箱,我发一个比较全的给你。pchar是delphi内定类型,其实也就相当于c语言里面的字符数组,实现实符串操作。比string用起来要烦一些,但是与Dll交互用string又烦了。Dll中:
    library cio;uses
      SysUtils,
      Classes,
      u_Comm in 'u_Comm.pas' {frm_Comm},
      u_protocol in 'u_protocol.pas';exports
    //串口操作
      InitComm,   //初始化指定串口
      CheckComm,  //检查串口是否已经打开
      CloseComm;  //关闭指定串口,最后一个用分号,前面的用逗号隔开。end;
    所有的函数在各个模块中实现。例如一个传字符串的函数如下:
    function KQ_QueryInfoByCardno(const iDeviceID:integer;var pcCardno:pchar):integer;//查询指定的卡号是否已经注册:
    var
      sin,sout:string;
    begin
      if not CheckComm then
      begin
        result:=E_CONNECT;
        exit;
      end;
      sin:=string(pcCardno);
      result:=ProcessPacket(sout,sin,WAITTIME_LONG);
      if result=E_OK then
      begin
        Unpacket(sin);
        sout:=copy(sin,5,6);
        strCopy(pcCardno,pchar(sout));
      end;
      writelog('查卡号: '+sin)
    end;在主程序中,调用Dll的函数如下:
    procedure QueryInfo;
    var
     pcCardno:pchar;
     errno:integer;
    begin
     getmem(pcCardno,12);
      strCopy(pcCardno,pchar('1258FB3F'));
      errno:=KQ_QueryInfoByCardno(devices[ideviceid],pccardno);
      if errno <> 0 then
       showmessage('查询失败')
      else
       showmessage('查询成功');
     freemem(pcCardno);
    end;
    这个是我正在用的,还有一些错误检查之类,很长。但关键的部分这里应该可以看得出来了。
      

  5.   

    可是的用的Pchar返回值在字符较长时就会有乱码。