现在我在程序中调用DLL提供的一个函数,函数原形如下
function ReadRecord(aCom,aMachineNo : Integer): PChar; StdCall ;
一开始返回的数据是正确的,过了段时间返回值就会出问题,返回的数据不完整从而出现乱码,或者返回的值是DLL中别的变量里的值,但是在日志当中看在ReadRecord函数返回前与返回后DLL中该字符串的内容都是正确的,在调用接口那段程序里就出错了。搞不清楚为什么,请大家赐教!
接收返回值的变量的类型 我用string 以及pchar 都试过了,都会有这个问题

解决方案 »

  1.   

    试试
    PWideChar 和WideString
      

  2.   

    这样作不对, string 作为返回就要引用 borlndmm.dll 就正常, 不过这样作 dll 就不标准了要用 Pchar, 但Pchar 不能作返回, 因为你返回的只是个指针, 这个地址处的内容会改变的, 正确作法是function ReadRecord(aCom,aMachineNo : Integer; Buf: Pchar; Size: Integer): Integer;由调用者分配一个足够大的内存, dll 中要用硬拷贝的方法把内容放到 Buf 里, 返回值可以是写入多少字节, 也可以不要
      

  3.   

    同意comanche,不要把dll中函数内部分配的空间地址作为函数的返回值,这样很容易AV。正确的做法就是由调用者开辟缓冲,并且将缓冲地区和长度作为参数传递给函数。
      

  4.   

    硬拷贝指的是用strcopy函数进行拷贝吗?
      

  5.   

    是, 如果你确定长度不会超 size, 也可以 string(buf) = 'xxxxx';
      

  6.   

    dll中的返回值用个全局的变量来保存应该就可以了
      

  7.   

    最安全的方法就是像comanche(太可怕)的建议那样,由调用者开辟一块内存传递给被调用者。