Windows函式呼叫

概述,MessageBoxA定義方法,MessageBoxW定義方法,注意事項,

概述

從Windows 1.0到Windows 3.1的16位元Windows中,MessageBox函式位於動態連結程式庫USER.EXE。在Windows 3.1軟體開發套件的WINDOWS.H中,MessageBox函式定義如下:
int WINAPI MessageBox (HWND, LPCSTR, LPCSTR, UINT) ;
注意,函式的第二個、第三個參數是指向常數字串的指標。當編譯連結一個Win16程式時,Windows並不處理MessageBox呼叫。程式.EXE檔案中的表格,允許Windows將該程式的呼叫與USER中的MessageBox函式動態連結起來。
32位的Windows(即所有版本的Windows NT,以及Windows 95和Windows 98)除了含有與16位相容的USER.EXE以外,還含有一個稱為USER32.DLL的動態連結程式庫,該動態連結程式庫含有32位元使用者介面函式的進入點,包括32位元的MessageBox。
這就是Windows支援Unicode的關鍵:在USER32.DLL中,沒有32位元MessageBox函式的進入點。實際上,有兩個進入點,一個名為MessageBoxA(ASCII版),另一個名為MessageBoxW(寬字元版)。用字串作參數的每個Win32函式都在作業系統中有兩個進入點!幸運的是,您通常不必關心這個問題,程式中只需使用MessageBox。與TCHAR表頭檔案一樣,每個Windows表頭檔案都有我們需要的技巧。

MessageBoxA定義方法

下面是MessageBoxA在WINUSER.H中定義的方法。這與MessageBox早期的定義很相似:
WINUSERAPI int WINAPI MessageBoxA ( HWND hWnd, LPCSTR lpText,
LPCSTR lpCaption, UINT uType) ;

MessageBoxW定義方法

下面是MessageBoxW:
WINUSERAPI int WINAPI MessageBoxW (HWND hWnd, LPCWSTR lpText,
LPCWSTR lpCaption, UINT uType) ;

注意事項

注意,MessageBoxW函式的第二個和第三個參數是指向寬字元的指標。
如果需要同時使用並分別匹配ASCII和寬字元函式呼叫,那么您可在Windows程式中明確地使用MessageBoxA和MessageBoxW函式。但大多數程式寫作者將繼續使用MessageBox。根據是否定義了UNICODE,MessageBox將與MessageBoxA或MessageBoxW一樣。在WINUSER.H中完成這一技巧時,程式相當瑣碎:
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
這樣,如果定義了UNICODE識別字,那么程式中所有的MessageBox函式呼叫實際上就是MessageBoxW函式;否則,就是MessageBoxA函式。
執行該程式時,Windows將程式中不同的函式呼叫與不同的Windows動態連結程式庫的進入點連結。雖然只有少數例外,但是,在Windows 98中不能執行Unicode版的Windows函式。雖然這些函式有進入點,但通常返回錯誤代碼。套用程式注意這些返回的錯誤並採取一些合理的動作。

相關詞條

熱門詞條

聯絡我們