我认为,去掉程序中所有的@那么就对了。
procedure TForm1.Button1Click(Sender: TObject);
var
  pS : PChar;
  Str : string;
begin
  try
    try
      pS := StrAlloc(100);
      StrPCopy(pS,'ABCDEF');//必须这样写,不能去掉'@'
      Str := PChar(pS);
      ShowMessage(Str);
    except    end;//except
  finally
  StrDispose(pS);
  end;//finally
end;

解决方案 »

  1.   

    不能去掉'@',chechy 老兄这种方法我也会,但我做的东东必须这样写,所以我才发贴子的
      

  2.   

    中间这样写不挺好吗?      pS := StrAlloc(100);
          StrPCopy(pS,'ABCDEF');//必须这样写,不能去掉'@'
          Str := pS;
          ShowMessage(Str);
     
      

  3.   

    我在程序中这样用通过了:var
      WinPath: PChar;
    begin  getmem(WinPath,256);//获得内存,没有使用StrAlloc();
      .....
      freemem(WinPath,256);//释放内存
    end;
    你试试看
      

  4.   

    我写的是个Dll需要用到可边参数
    procedure test(var S :pchar);
    begin
      strpcopy(s,'ABCD')
    //关键在这句,如果这样写,D5,VB都可以得到正确的返回值,但PB得不到正确结果,
    //修改成  strpcopy(@s,'ABCD')PB就对了,但D5 在释放的时候就出错了
    end;
    就是这样一个问题
    希望大虾们多多帮助,谢谢
      

  5.   

    你在strpcopy时就不能这样用。
    因为,过程和函数的局部变量是在堆栈中的,你这样直接改指针的内容,就把堆栈给改了,而且改写字节数是字符串长度+1,运行时就不能找到返回地址,当然要出错了。是不可能运行正确的。
      

  6.   

    to hxf812(剑知心):
    StrPCopy(@pS,'ABCDEF')改变了指针的指向的值,已出现越界。
    后面释放当然有问题。
    StrAlloc申请的内存还是用StrDispose释放吧。
    “我做的东东必须这样写”,我不知道你到底要干吗,明显是错的嘛。
      

  7.   

    这样分析对不对:
      这个函数是给PB使用的。而PB在传S参数时,应该传给一个已经分配了空间的指针。所以,DELPHI中最好不用分配和释放空间。如果你分配了空间,而在没有返回前就释放掉,PB使用这个值将是很危险的,会产生奇怪的结果。如果PB部分也是你做,就好说了。
      

  8.   

    to hwill(潜龙在渊):没用的,我试过了
    to disney(编程乐园),hellion:
    难没什么好办法了吗,我也不想这样用strpcopy可没办法,我写的Dll最终是要由pb调用的,别的方法我都试过了,好象只能这样写
    Dll中的代码如下
    procedure Test(Var s :pchar); stdcall;
    begin
      //一个最简单的例子,返回一个串
      strpcopy(s,'ABCDEF');//D5,Vb对,PB接收不到返回值
      //修改成strpcopy(@s,'ABCDEF');PB 对了,VB,D5 出错
    end;
    我的Dll是为PB程序编写的,只要PB能用就行。我明天就要交工了,大家救命啊!
      

  9.   

    这样好了,你写两个代码,D5、VB用一个,PB用一个:)
      

  10.   

    那就别释放了,而且也不用Alloc了。
      

  11.   

    不释放也出错,我很奇怪,Str := PChar(@pS);都没出错,怎么会不能释放呢?
    哪位用过PB的高人遇到过这种情况?
      

  12.   

    我没用过PB,但是这么看,PB简直太不可思议了,不合常理。
      

  13.   

    看来不只是我遇到这中情况,Leehunter 也遇到了 看帖子 http://www.csdn.net/expert/TopicView.asp?id=79545to chechy(chechy):
      听我一句话,千万别用。
      

  14.   

    在procedure test(var S :pchar);中对s 分配内存又dispose掉的作法对返回s是无意义的因为重要的不是s的值也就是地址,而是s所指向的内存区域,所以var s : pchar的写法也不可取。在返回之前已被你释放的内存对你有何意义。如果你转递是指针,可以在外部释放的只是别忘记了就行。
      

  15.   

    回复人: arxing(阿行) (2001-9-13 11:24:51)  得0分 
    管理内存,最好用C。  
    回复人: victorlee_lq(victor) (2001-9-13 15:22:37)  得0分 
    我在这里大声疾呼 "PB 是垃圾!!!"  
      

  16.   

    Str := PChar(@pS);
    去掉这句的@
      

  17.   

    var P: PChar;
    getmem(P,256);
    strcopy(P,pchar('hdfdgdf'));
    freemem(P)
      

  18.   

    to arxing(阿行)
      这不是用什么工具的问题,c的程序员用不好也会出错。指针内存的操作在于程序员的水平不在于工具,pascal操作内存不比c差。
      

  19.   

    type
       myrec=record
         buff:array[1..n] of char; 
       end;
     
    procedure test(var S :myrec);
    begin
      strmove(@s.buff,'ABCD',sizeof('abcd'));
    end;