為了能在Windows下快速開發應用程序,Delphi對Windows的控件都進行了很好的封裝,這樣,我們就可以直接使用Delphi的控件來編寫程序,而不用使用格式、調用控制復雜的API來進行開發,為我們節省了大量的開發時間。
可有時候這些控件解決不了我們的問題,這個時候我們就不得不使用API了,也就是Windows的應用程序接口。這樣,問題也就隨之而來了,API是用C++語言編寫的,而Delphi的腳本語言是PASCAL,兩者使用的數據類型是不兼容了。那麼,如何在Delphi中調用數據類型不兼容的API呢,這就是本文中我為大家介紹的內容了。
我們在Delphi中最常用到的一個數據類型是String類型,可API並不支持,那麼當我們需要從API中得到一個string類型的值時該如何去做呢?看看下面的程序:
function GetSysPath: string;
var
sTmp: string;
begin
result := ’’;
//調用WindowsApi得到Windows的系統路徑
SetLength(sTmp,256);
GetSystemDirectory(PChar(sTmp),256); //這是一個API函數
SetLength(sTmp,StrLen(PChar(sTmp)));
result := sTmp + ’\’;
end;
在該函數中,調用了API函數GetSystemDirectory,它的第一個參數是一個指向以NULL結尾字符串的指針,在Delphi中,這種數據類型是PCHAR,所以這裡要進行數據類型轉換,要寫成PChar(sTmp)。 我們再看另外一個例子:
procedure TForm1.ChangeAppIcon;
var
icon: TIcon ;
begin
icon := TIcon.Create;
try
icon.Handle := ExtractIcon(application.Handle,pchar(’D:\WINNT\regedit.exe’),0); //這是一個API函數
if icon.Handle <> 0 then
application.Icon := icon;
finally
icon.Free;
end;
end;
該過程通過API函數得到一個應用程序的圖標,來動態改變當前程序的圖標。API函數ExtractIcon返回的是一個HICON類型,是一個指向圖標的指針,如果寫成application.Icon = ExtractIcon(application.Handle, pchar(’D:\WINNT\regedit.exe’), 0); 編譯肯定不通過,數據類型不一致嗎!application.Icon屬性是Ticon類型的,我們可以創建一個 Ticon,把API的返回值賦給Ticon.Handle,最後將ICON賦值給application.Icon,就解決了我們的問題。
通過上面的例子,我們可以看到,Delphi並不直接支持Windows中的數據類型,只能通過封裝的形式來支持。要熟練地調用API函數,我們一定要熟悉Delphi的封裝機制,多看、多寫,多去實踐,那麼,我們就能夠隨心所欲的調用API函數了。