<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Windows API `main`函數 > 原文: [http://zetcode.com/gui/winapi/main/](http://zetcode.com/gui/winapi/main/) 在 Windows API 教程的這一部分中,我們將討論`main`函數。 ## `main`函數原型 `main()`函數是 C 程序的入口點。 但是,它不是第一個運行的程序。 當入口點為`main()`時,程序實際上從稱為`mainCRTStartup()`的函數開始執行。 該函數位于 C 運行時庫中。 它初始化諸如內存管理器,文件 I/O 支持和`argv`參數之類的東西。 之后,`mainCRTStartup()`函數將調用`main()`函數。 ```c int main(void); int main(int argc, char **argv); int main(int argc, char *argv[]); ``` 這些是經典控制臺程序的`main()`函數的函數原型。 `classic_console.c` ```c #include <stdio.h> int main(void) { puts("This is a classic C program."); return 0; } ``` 上面的源代碼提供了經典控制臺 C 程序的示例。 ```c C:\Users\Jano\Documents\Pelles C Projects\ClassicConsole>ClassicConsole.exe This is a classic C program. ``` 這是`ClassicConsole.exe`程序的輸出。 ## `wmain`函數原型 先前的`main`函數原型只能接收 ASCII 字符。 如果我們想要一個可以從命令行接收寬字符的程序,我們將使用`wmain()`函數原型。 ```c int wmain(void); int wmain(int argc, wchar_t **argv); int wmain(int argc, wchar_t *argv[]); ``` 上面的`wmain()`函數原型在命令行上接收`wchar_t`字符。 當我們使用這些原型時,執行從名為`wmainCRTStartup()`的函數開始,該函數隨后將調用`wmain()`函數。 `win_console.c` ```c #include <windows.h> #include <wchar.h> int wmain(int argc, wchar_t **argv) { PDWORD cChars = NULL; HANDLE std = GetStdHandle(STD_OUTPUT_HANDLE); if (std == INVALID_HANDLE_VALUE) { wprintf(L"Cannot retrieve standard output handle\n (%d)", GetLastError()); } if (argv[1]) { WriteConsoleW(std, argv[1], wcslen(argv[1]), cChars, NULL); } CloseHandle(std); return 0; } ``` 我們有一個`wmain()`函數,可以接收寬字符。 該示例顯示控制臺程序的第一個參數。 要在 Pelles C 中插入命令行參數,我們轉到項目選項,然后選擇常規選項卡。 有一個名為“命令行參數”的編輯框。 ```c int wmain(int argc, wchar_t **argv) { ``` `wmain()`函數的第二個參數的`wchar_t`類型告訴我們程序輸入為寬字符。 ```c HANDLE std = GetStdHandle(STD_OUTPUT_HANDLE); ``` `GetStdHandle()`函數將句柄返回到標準輸出。 ```c if (std == INVALID_HANDLE_VALUE) { wprintf(L"Cannot retrieve standard output handle\n (%d)", GetLastError()); } ``` 如果發生錯誤,我們會收到`INVALID_HANDLE_VALUE`返回碼。 對于這種情況,我們將顯示一條錯誤消息。 `GetLastError()`函數檢索上一個錯誤代碼值。 ```c WriteConsoleW(std, argv[1], wcslen(argv[1]), cChars, NULL); ``` 我們使用`WriteConsoleW()`函數以寬字符寫入控制臺。 ```c CloseHandle(std); ``` `CloseHandle()`函數將打開的手柄關閉到標準輸出。 ```c C:\Users\Jano\Documents\Pelles C Projects\WindowsConsole>WindowsConsole.exe компилятор компилятор ``` 我們將俄語單詞(編譯器)作為參數傳遞給程序。 該程序只需將參數打印回控制臺即可。 請注意,為了查看正確的字符,我們需要將控制臺的默認字體更改為 Lucida Console。 我們需要一種真正的字體來正確顯示寬字符。 ## `_tmain`函數原型 `_tmain()`函數是 Microsoft 擴展。 它使程序員可以輕松地創建程序的 ANSI 和 UNICODE 版本。 它是一個 C 宏,它轉換為`wmain()`或`main()`函數,具體取決于是否定義了`_UNICODE`常量。 在過去,創建 ANSI 和 UNICODE 構建都是很常見的。 如今,許多程序員建議僅創建 Unicode 程序。 這也是我們在本教程中將要做的。 我們將主要創建 Unicode 程序。 ```c int _tmain(void); int _tmain(int argc, TCHAR **argv); int _tmain(int argc, TCHAR *argv[]); ``` 這些是`_tmain`函數原型。 `TCHAR`宏轉換為`char`或`wchar_t`。 它由`UNICODE`常數控制。 `tmain_ex.c` ```c #define _UNICODE #define UNICODE #include <windows.h> #include <tchar.h> int _tmain(int argc, TCHAR *argv[]) { PDWORD cChars = NULL; HANDLE std = GetStdHandle(STD_OUTPUT_HANDLE); if (std == INVALID_HANDLE_VALUE) { _tprintf(L"Cannot retrieve standard output handle\n (%d)", GetLastError()); } if (argv[1]) { WriteConsole(std, argv[1], _tcslen(argv[1]), cChars, NULL); } CloseHandle(std); return 0; } ``` 該示例輸出其第一個參數(如果有)。 ```c #define _UNICODE #define UNICODE ``` 在這里,我們定義兩個常數。 這些定義意味著我們將構建一個 Unicode 程序。 它們轉換 C 運行時和 Windows 頭文件中的 C 宏。 `_UNICODE`常量在 C 運行時中轉換宏。 (這些宏以下劃線開頭。)`UNICODE`常量轉換 Windows 頭文件中的宏。 ```c #include <windows.h> ``` 我們包括`TCHAR`宏的定義。 宏受`UNICODE`常數的影響。 ```c #include <tchar.h> ``` 我們必須為`_tmain`和`_tcslen`宏包含此頭文件。 根據`_UNICODE`常數翻譯它們。 ```c int _tmain(int argc, TCHAR *argv[]) { ``` 在我們的情況下,`_tmain()`函數將轉換為`wmain()`,`TCHAR`宏將轉換為`wchar_t`。 ```c WriteConsole(std, argv[1], _tcslen(argv[1]), cChars, NULL); ``` `WriteConsole()`宏被轉換為`WriteConsoleW()`函數。 `WriteConsoleW()`將輸出寫入控制臺。 `_tcslen`宏被轉換為`wcslen()`函數; 它返回寬字符串的長度。 ```c C:\Users\Jano\Documents\Pelles C Projects\TMainEx>TMainEx.exe "операционная система" операционная система ``` 該程序將另一個俄語單詞(操作系統)作為參數并將其打印到控制臺。 ## `WinMain`函數原型 到目前為止,我們已經有了控制臺的`main`函數。 對于圖形用戶界面開發,我們使用`WinMain`函數原型之一。 ```c int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow); ``` 這三個函數原型用于 Windows GUI 應用的入口點。 `wWinMain()`函數的`pCmdLine`參數包含作為 Unicode 字符串的命令行參數。 `WinMain()`函數的`pCmdLine`參數包含作為 ANSI 字符串的命令行參數。 `_tWinMain`是一個 C 宏,它取決于是否定義了`_UNICODE`常量,它轉換為其他兩個函數原型。 當入口點為`WinMain()`時,程序的執行從`WinMainCRTStartup()`開始。 在`wWinMain()`的情況下,執行從`wWinMainCRTStartup()`開始。 `winmain_ex.c` ```c #include <windows.h> int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR szCmdLine, int CmdShow) { MessageBoxW(NULL, szCmdLine, L"Title", MB_OK); return 0; } ``` 此代碼在屏幕上顯示一個小消息框。 它顯示第一個命令行參數。 ```c int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR szCmdLine, int CmdShow) ``` `wWinMain()`函數的第三個參數是`PWSTR`(指向寬字符串的指針)。 它接受寬字符。 ![A message box](https://img.kancloud.cn/e9/ed/e9ed90176951c0583a4b5f2012c47a4e_104x100.jpg) 圖:消息框 在 Windows API 教程的這一部分中,我們提到了`main`函數。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看