Windows下的函式

2022-09-15 13:30:22 字數 1570 閱讀 8204

在進行windows應用程式設計中,程式設計師除了需要知道有關乙個函式的常用資訊(例如函式的名字,近函式或遠函式,返回型別以及應如何呼叫)之外,同時還要知道更多的內容:乙個**函式、引出函式或是乙個引入函式。

引出函式:這個術語與乙個函式如何在乙個模組中說明而在另乙個模組中被呼叫有關。引出函式是在乙個模組中定義而在這個模組之外被呼叫的一種函式;或是被windows或是被另乙個模組呼叫。這些函式必須以一種特定的方式進行說明,並被編譯器作非凡的處理。這樣,當它們被呼叫時,它們會被正確地束定到合適的資料段上。dll為其它模組提供要被呼叫的函式,因此,每個dll一般都帶有乙個dll庫,以便應用程式可以合法地呼叫dll中的函式。dll庫由dll中每個引出函式的入口點組成。整個windows api就是由構成windows環境的不同的模組所引出的函式組成,這些api函式的入口點在乙個名為import.lib的dll庫中說明。

引入函式:在dll中引出的函式若要能為乙個模組呼叫,必須在這個模組中將這個函式說明為引入函式。由此可見引出函式和引入函式表達的是從兩種角度處理同乙個函式的術語:引出模組中的乙個函式使得這個函式能被其它模組呼叫;呼叫引出函式的模組通過引入這個函式才能呼叫它。在製作windows應用程式時,聯結器自動包含乙個名為import.lib的庫檔案。這個檔案答應應用程式呼叫windows api中的函式。這個檔案被稱為引入庫。引入庫提供了應用程式與乙個到多個dll中可被這個應用程式呼叫的函式之間的連線。

**函式:**函式是一種非凡的引出函式,是由 windows環境直接呼叫的函式。乙個應用程式至少要有乙個**函式。當一條訊息要交給應用程式處理時,windows呼叫這個**函式。這個函式對應於乙個活動視窗,被稱為這個視窗的視窗函式。因為許多應用程式至少建立乙個視窗,並且windows需要向這個視窗傳送訊息,所以,處理訊息的函式必須由windows呼叫。在請求windows列舉它所維護的物件時,例如字型或視窗,windows也要呼叫應用程式中的**函式。當向windows提出這樣的請求時,就必須向windows提供**函式的位址。

由於引出函式是在不同的模組中被呼叫的,也就是說,呼叫者的**段與被呼叫的引出函式的**段不在同乙個段中,因此,在所開發的windows應用程式中,引出函式都被說明為遠函式。為了程式執行的效率原因,引出函式都使用pascal呼叫約定,這種呼叫約定不同於c呼叫約定的地方在於:

最左邊的引數先入棧:pascal呼叫約定的引數進入棧的順序是函式呼叫中最左邊的引數先入棧。c的呼叫約定與此相反,它採用最右邊的引數先入棧。

被呼叫的函式負責從展中清除引數:pascal呼叫約定的函式在返回時負責清除棧中的引數;c呼叫約定的函式不作這種工作,而由呼叫者來作;這樣,當程式中呼叫了大量的使用c呼叫約定的函式時,為清除棧中的引數,在程式中要額外地增加許多**。

全域性識別符號不保持原來的大小寫(一般被為大寫形式),也不在識別符號前面加下劃線。

為便於程式開發活動,在windows.h中定義了兩個型別名,用於在程式說明引出函式:

型別說明 winapi 等價於far pascal,說明該函式是乙個引出函式,這個型別名只用於在dll中說明引出函式,或在應用程式中對dll中的引出函式進行函式說明時。 callback 等價於far pascal,說明該函式是乙個**函式,它常被用在應用程式模組中說明乙個視窗函式或其它種類的**函式

資料引用:

Windows下多執行緒常用函式

分類 c ui多執行緒 2011 11 03 16 13 594人閱讀收藏 舉報windows attributes winapi null security 多執行緒 1.執行緒建立 該函式在其呼叫程序的程序空間裡建立乙個新的執行緒,並返回已建執行緒的控制代碼。handle createthrea...

windows 下隱藏 system 函式彈窗

下面的程式是解決windows 下面呼叫 system 函式的時候,會有視窗彈出的問題 include brief 普通字元轉寬字元 param lpcszstr 普通字元 param lpwszstr 轉換後的寬字元 param dwsize 儲存寬字元的緩衝區大小 return bool mby...

Windows 2000下Api函式的攔截分析

簡介 api攔截並不是乙個新的技術,很多商業軟體都採用這種技術。對windows的api函式的攔截,不外乎兩種方法,第一種是mr.jeffrey richter 的修改exe檔案的模組輸入節,種方法,很安全,但很複雜,而且有些exe檔案,沒有dll的輸入符號的列表,有可能出現攔截不到的情況。第二種方...