delphi中使用API時的一點注意之處

2021-04-12 13:37:07 字數 843 閱讀 5349

我們知道,很多情況下,windows api函式都需要乙個緩衝區,例如以獲取臨時目錄的api gettemppath為例,這個函式需要乙個buffer用來存放返回的目錄名稱,而很多人**(包括許多高手和borland的專家)是這樣寫的:

function gettempdirectory: string;

vartempdir: array[0..255] of char;

begin

gettemppath(255, @tempdir);

result := strpas(tempdir);

end;

很明顯,如果臨時目錄的名稱超過256,那麼就會發生緩衝區溢位,得到的資料也不完全,實際上,臨時目錄全路徑很可能超過256,windows的長檔名是指這個目錄或者檔案的名字的限制,不是full pathname的限制!那麼象這種函式該怎麼來使用呢?

一般地,需要緩衝區的函式,我們需要呼叫兩次!第一次呼叫是為了獲得緩衝區的長度,然後第二次才是真正的呼叫,以上面的為例,真正正確的寫法應該是:

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;

其他類似的函式如getcomputername等等,都應該如此使用。 另此處也注意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的內容。但是,可以通過下面的方法來執行父類的內容 例...