1.
var buf:pchar;
begin
  GetMem(buf, 100+1);
  try
    GetModuleFileName(0,buf,length(buf));
    ShowMessage(buf);
  finally
    FreeMem(buf);
  end;
end;2.
var
  buf: array[0..100] of Char;
begin
  GetModuleFileName(0, buf, Length(buf));
  ShowMessage(buf);
end3.
var buf:String;
begin
  SetLength(buf,100);
  GetModuleFileName(0,pchar(buf),length(buf));
  buf:=pchar(buf);
  ShowMessage(buf);
end;
大家先猜想下效果是什么
这里的2.3效果一样,
----------
然后想请教各位为什么1的效果不跟2.3一样,真奇怪,疑惑,期盼解答

解决方案 »

  1.   

    var buf:pchar;
    begin
      GetMem(buf, 100+1);
      try
        GetModuleFileName(0,buf,length(buf));  //如果你這樣能取得 buf 的大小就行。這個問題上次有人問過了。  
        ShowMessage(buf);
      finally
        FreeMem(buf);
      end;
    end; 
      

  2.   

    當然你可以這樣寫:
    procedure TForm1.Button1Click(Sender: TObject);
    var buf:pchar;
    begin
      buf := StrAlloc(101);
      try
        GetModuleFileName(0,buf,StrBufSize(buf));
        ShowMessage(buf);
      finally
        StrDispose(buf);
      end;
    end;
      

  3.   

    哦,不错,刚才测试下length(buf)不是101而是3
    现在就是想咨询下var buf:pchar; 
    begin 
      GetMem(buf, 100+1); 
      ShowMessage(inttostr(length(GetMem)));//这里的长度为什么不是101,及究竟用什么函数能获取这里的pchar长度
    end;
      

  4.   

    GetMem(buf, 100+1); //这个不是分配101吗?
    既然如此length(buf);//为什么就获取不了我分配的长度呢
      

  5.   

    對應去用.  SetLength <=> Length 
      

  6.   

    第一个 
    var buf:pchar;  length(buf) 
    buf 是个指针,只不过是pchar 类型的。当你 length(buf) 使用时,buf的值只是分配了内存,但这块内存中的内容是不确定的。刚好第四位就是一个#0 length(buf) 就认识你的长度是3 。
    而 GetModuleFileName(0,buf,length(buf)); 是需要指定你分配的内存的长度的,长度是3的话,就将整个路径的前三个字符复制到了buf中。
    如果在 GetMem(buf, 100+1); 后ZeroMemory(buf,101); 初始化了,length(buf) =0了。
    用 GetMem的时候必须要记住分配的内存的大小,你不能通过一个指针来确定给它分配了多少内存。
    第二个 
    var buf: array[0..100] of Char; 是指定长度的数组,length(buf)返回的就是101
    第三个和第二个是类似的。
      

  7.   

    对于申请的buf,应该用sizeof去得到大小吧
      

  8.   

    其實說白了,、procedure _DynArrayLength;
    asm
    {       FUNCTION _DynArrayLength(const a: array of ...): Longint; }
    {     ->EAX     Pointer to array or nil                           }
    {     <-EAX     High bound of array + 1 or 0                      }
            TEST    EAX,EAX
            JZ      @@skip
            MOV     EAX,[EAX-4]
    @@skip:
    end;LENGTH取出來的就是這裏的值。