Hello World
Microsoft Windows 應用程式通常編寫為控制檯應用程式或視窗化應用程式(還有其他型別,如服務和外掛)。程式設計師的不同之處在於程式設計師提供的應用程式源的主入口點的介面不同。
當 C 或 C++應用程式啟動時,可執行載入程式使用的可執行入口點是編譯器提供的執行時。可執行載入程式讀入可執行檔案,對所需的映像執行任何修復,然後呼叫可執行入口點,對於 C 或 C++程式,該入口點是編譯器提供的執行時。
載入程式呼叫的可執行入口點不是應用程式設計師提供的主入口點,而是編譯器和建立可執行檔案的連結器提供的執行時。執行時為應用程式設定環境,然後呼叫程式設計師提供的主入口點。
Windows 控制檯應用程式可能具有幾個略微不同的介面,用於程式設計師提供的主入口點。它們之間的區別在於主入口點是傳統的 int main (int argc, char *argv[])
還是它是特定於 Windows 的 int _tmain(int argc, _TCHAR* argv[])
版本,它提供了應用程式引數中的寬字元。如果使用 Visual Studio 生成 Windows Win32 控制檯應用程式專案,則生成的源將是 Windows 特定版本。
Windows 視窗(GUI)應用程式具有用於程式設計師提供的主入口點的不同介面。程式設計師提供的這個主要入口點具有更復雜的介面,因為 Runtime 設定了 GUI 環境並提供了附加資訊以及應用程式引數。
此示例說明 Windows 視窗(GUI)主入口點介面。要探索此主題,你應該:
- 帶編譯器的 IDE(最好是 Visual Studio)
- C 知識
使用 IDE 建立一個空的 Win32 視窗(GUI,而不是控制檯)專案。必須為視窗應用程式(而不是控制檯應用程式)設定專案設定,以便連結器與正確的執行時連結。建立一個 main.c
檔案,將其新增到專案中,然後鍵入以下程式碼:
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow)
{
return MessageBox(NULL, "hello, world", "caption", 0);
}
這是我們的 Win32“Hello,world”計劃。第一步是包含 Windows 標頭檔案。所有 Windows 的主標題都是 windows.h
,但還有其他的。
WinMain
與用於控制檯應用的標準 int main()
不同。介面中使用了更多引數,更重要的是,視窗應用程式的主要入口點使用與標準 C / C++不同的呼叫約定。
限定符 APIENTRY
表示呼叫約定,它是在堆疊上推送引數的順序 † 。預設情況下,呼叫約定是 __cdecl
指示的標準 C 約定。但是,Microsoft 使用了一種不同型別的呼叫約定,即 PASCAL 約定,用於由 __stdcall
限定符指示的 Windows API 函式。APIENTRY
是 windows.h
包含的一個標頭檔案中 __stdcall
的已定義名稱(另請參閱什麼是__stdcall? )。
WinMain
的下一個論點如下:
- hInst:例項控制代碼
- hInstPrev:前一個例項控制代碼。不再使用。
- cmdline:命令列引數(請參閱將 WinMain(或 wWinMain)引數傳遞給普通 main )
- cmdshow:表示是否應顯示視窗。
我們還沒有使用任何這些論點。
在 WinMain()
內部,是對 MessageBox()
的呼叫,它顯示一個帶有訊息的簡單對話方塊,一個訊息框。第一個引數是所有者視窗的控制代碼。由於我們還沒有自己的視窗,請通過 NULL
。第二個引數是正文。第三個引數是標題,第四個引數包含標誌。傳遞 0 時,將顯示預設訊息框。下圖剖析了訊息框對話方塊。
好的連結:
† 僅限 32 位系統。其他架構具有不同的呼叫約定。