我們知道,很多情況下,windows api函式都需要乙個緩衝區,例如以獲取臨時目錄的api gettemppath為例,這個函式需要乙個buffer用來存放返回的目錄名稱,而很多人**(包括許多高手和borland的專家)是這樣寫的:
function gettempdirectory:
string;
var
tempdir:
array[0..255]
of char;
begin
gettemppath(255, @tempdir);
result := strpas(tempdir);
end;
很明顯,如果臨時目錄的名稱超過256,那麼就會發生緩衝區溢位,得到的資料也不完全,實際上,臨時目錄全路徑很可能超過256,windows的長檔名是指這個目錄或者檔案的名字的限制,不是full path
name的限制!那麼象這種函式該怎麼來使用呢?
一般地,需要緩衝區的函式,我們需要呼叫兩次!第一次呼叫是為了獲得緩衝區的長度,然後第二次才是真正的呼叫,以上面的為例,真正正確的寫法應該是:
procedure tform1.button1click(sender: tobject);
varmybuf:array of char;
len:integer;
begin
len:=gettemppath(0,nil);
setlength(mybuf,len);
gettemppath(len+1,pchar(mybuf));
showmessage(pchar(mybuf));
end;
其他類似的函式如get***putername等等,都應該如此使用。 另此處也注意pchar的使用方法!
delphi中使用API時的一點注意之處
我們知道,很多情況下,windows api函式都需要乙個緩衝區,例如以獲取臨時目錄的api gettemppath為例,這個函式需要乙個buffer用來存放返回的目錄名稱,而很多人 包括許多高手和borland的專家 是這樣寫的 function gettempdirectory string v...
Delphi中使用多執行緒
這些天在indy的阻塞式socket模型的強迫下,開始在delphi中使用多執行緒。總結了一些經驗,儘管非常膚淺 1 對於vcl的控制項 大部分vcl的控制項的方法和屬性是不能保證執行緒安全的。我粗淺的理解執行緒安全為如果這個函式同時被兩個執行緒呼叫時,由於內部的指令不能保證按順序 即中間插入其他執...
delphi中使用override需要注意的地方
在override時,如果override的是procedure,則加上關鍵字inherited 就會執行父類同名procedure的所有過程,然後再執行子類中特有的過程。如果override的是function則不會執行父類中同名function的內容。但是,可以通過下面的方法來執行父類的內容 例...