從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在WINUSER.H中定義的方法。這與MessageBox早期的定義很相似:
WINUSERAPI int WINAPI MessageBoxA (HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) ;
下面是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函數。雖然這些函數有進入點,但通常返回錯誤碼。應用程式注意這些返回的錯誤並採取一些合理的動作。