请问从Dll中返回字符串值最保险的办法是什么呢?我是这样做的,function GetStrings: Pointer;stdcall;
var
  strResult: String;
begin
  .....
  strResult := 'Hello';
  .....  Result := PChar(strResult);end;
可是不太稳定,有时返回的值后面有乱码,请问是什么原因?

解决方案 »

  1.   

    不是不稳定,你这样作本身就是错误的。function GetStrings(var AChar : PChar): Pointer;
    var
      strResult: String;
    begin
      .....
      strResult := 'Hello';
      .....  AChar := PChar(strResult);end;
      

  2.   

    to netlib:我的函数也有一个这么一个参数,我没有写出来!我的函数原型是这样的:
    function GetStrings(var AChar: PChar): Integer;stdcall;
    var
      strResult: String;
    begin
      .....
      strResult := 'Hello';
      .....  AChar := PChar(strResult);end;返回的 Integer 是对的,可是我返回的AChar有时就有乱码?为什么呢?
    还有就是在这儿定义 PChar和Pointer有什么区别呢?
      

  3.   

    建议你采用netlib(河外孤星)提出的方式,不管你是传入或传出,字符串都用pchar类型,如果是静态调用用"string"将不会有问题
      

  4.   

    如果用string的话,在两边的dpr文件里都use ShareMem,写在use的第一个
      

  5.   

    可是在Vb中没有PChar类型啊!我的Dll是要在Vb中调用的!在Vb中应该是什么类型呢?
      

  6.   

    PChar是一个结尾为NULL的字符串。PChar(string)是把String[0]去掉,在结尾加一个NULL
      

  7.   

    我已经将String转为PChar了,可是为什么还是有乱码呢?比如说返回'123'
    他有时就能返回 '123 '不知道123的后面是什么东东,我在调用程序里调用该函数后给Text1赋值,如:dim a as integer
    dim b as string
    b = ""
    a = GetStrings(b)text1.text = b & "|||"
    MsgBox aa返回的数字没有问题,可是b返回来的值就不稳定了,
    我想让他返回“123”可是在Text1里有时会显示123,正确的应该是“123|||”,不知道为什么?
      

  8.   

    你用的是VB我不太熟悉。在Delphi里PChar的最后一位是NULL,在VB里NULL是怎么处理的我就不知道了。
      

  9.   

    那怎么保证在Delphi里做的Dll,(返回字符串)供其他语言调用呢?
      

  10.   

    function GetStrings: Pointer;stdcall;
    var
      strResult: String;
    begin
      .....
      strResult := 'Hello';
      .....  Result := PChar(strResult);end;
    这是一个对象生存期的问题,strResult是你在该函数内部声明的,该函数结束后就不能够保证该对象的有效性了(因为该对象指向的内存有可能被其他程序重新写入),这时就有可能出现乱码了,解决的办法一个使用静态声明(象C++那样),一个就是声明一个指针,然后分配空间,在调用Dll的外部程序中再去释放该内存即可
      

  11.   

    to daniel007(添) :非常谢谢你,我理解了你所说的,可是我不知道在Dll里应该怎么做?在外部Exe里又怎么做,你能详细一点给我写个Demo吗?谢谢!我的外部Exe程序是用Vb写的