淺議Delphi中的WindowsAPI調(diào)用

字號(hào):

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