function getstr(s:pchar):pchar;
var
tmp:string;
begin
        tmp:=string(s);
        result:=pchar(tmp);
end;showmessage(getstr('d'));//这里显示为空
showmessage(getstr('ddssssdd'));//这里正常请指点,谢谢!

解决方案 »

  1.   

    服了,这样
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      showmessage(getstr('s'));
      showmessage(getstr('ddssssdd'));
    end;function TForm1.getstr(s: pchar): pchar;
    begin
      result:= s;
    end;
      

  2.   

    谢谢 xixuemao(俺可是㊣②㈧经儿滴人)
    问题是我要在以下两行中间对字符串进行其他的处理.
    tmp:=string(s);
    result:=pchar(tmp);
      

  3.   

    //这样改
    function getstr(s:string):pchar;
    begin
      result:=pchar(s);
    end;
    procedure TForm1.btn1Click(Sender: TObject);
    begin
      showmessage(getstr('d'));//这里显示为空
      showmessage(getstr('ddssssdd'));//这里正常
    end;
      

  4.   

    如果不是写在dll里面,参数和返回值都用string就可以了,要不来回转换多麻烦啊。
      

  5.   

    我这个要做到dll里面去,不知参数为string行不行,另外这两行
    tmp:=string(s);
    result:=pchar(tmp);为什么不行?
      

  6.   

    或者这样也可以:procedure TForm1.Button1Click(Sender: TObject);
    begin
      showmessage(getstr('s'));
      showmessage(getstr('ddssssdd'));
    end;function TForm1.getstr(s: pchar): pchar;
    var
      tmp: string;
      a: array[0..255] of Char;
    begin
      tmp:= strpas(s);
      strpcopy(a,tmp);
      result:= a;
    end;
      

  7.   

    谢谢  xixuemao(俺可是㊣②㈧经儿滴人) 
    你以上这个是好用的,但为什么这两行,在7个字符以下的会出错,而8个或8个以上却没事呢?
    tmp:=string(s);
    result:=pchar(tmp);
      

  8.   

    你的这种强制转换本身是有隐患的,并不是因为字符的多少。
    引用:
    将 string 赋值给一个 PChar 变量类型,只是简单地将string的指针值赋值给PChar 变量类型,而string 的引用计数并不因此操作而发生变化,因为这种情况 PChar 会对 string 产生依赖,当string 的引用计数为零自动释放内存空间后,PChar很可能指向一个无效的内存地址
    所以建议用strpas和strpcopy进行转换。
      

  9.   


    function TForm1.getstr(s: string): pchar;
    begin
    result:= @s[1];
    end;