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