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一样,真奇怪,疑惑,期盼解答
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一样,真奇怪,疑惑,期盼解答
begin
GetMem(buf, 100+1);
try
GetModuleFileName(0,buf,length(buf)); //如果你這樣能取得 buf 的大小就行。這個問題上次有人問過了。
ShowMessage(buf);
finally
FreeMem(buf);
end;
end;
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;
现在就是想咨询下var buf:pchar;
begin
GetMem(buf, 100+1);
ShowMessage(inttostr(length(GetMem)));//这里的长度为什么不是101,及究竟用什么函数能获取这里的pchar长度
end;
既然如此length(buf);//为什么就获取不了我分配的长度呢
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
第三个和第二个是类似的。
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取出來的就是這裏的值。