main WinMain入口函式比較

2021-06-16 12:52:15 字數 3040 閱讀 4968

c/c++語言中的main函式, 經常帶有引數argc, argv, 如下:

int main(int argc, char** argv)

int main(int argc, char* argv) //也可以是wchar_t 或 tchar

argc 是指命令列輸入引數的個數, argv儲存了所有的命令列引數. 在命令列下, 每兩個argv[n]之間以空格分隔.

如在命令列下輸入 test.exe a b

argc 為 3

argv[0] 為 "test.exe"

argv[1] 為 "a"

argv[2] 為 "b"

以下乙個簡單的程式可以幫你看看argc, argv具體代表什麼.

#include

int main(int argc, char* argv)

return 0;

}另外, vc環境下向程式傳遞引數可以在 debugging -> command argument 下設定. (下面說的winmain也一樣)

在vs2008下,右鍵要除錯的專案—>properties—>debugging—>command arguments—>輸入你要輸入的引數即可。

winmain函式的原型宣告如下:

int winapi winmain(

hinstance hinstance,     // handle to current instance

hinstance hprevinstance, // handle to previous instance

lpstr lpcmdline,         // command line

int ncmdshow             // show state

);winmain函式接收4個引數, 這些引數都是在系統呼叫winmain函式時, 傳遞給應用程式的.

第乙個引數hinstance表示該程式當前執行的例項的控制代碼, 這是乙個數值. 當程式在windows下執行時, 它唯一標識執行中的例項(注意, 只有執行中的程式例項, 才有例項控制代碼). 乙個應用程式可以執行多個例項, 每執行乙個例項, 系統都會給該例項分配乙個控制代碼值, 並通過hinstance引數傳遞給winmain函式.

第二個引數hprevinstance (msdn)在win32環境下, 這個引數不起作用,歷史遺留,hprevinstance=null;

第三個引數lpcmdline是乙個以空('\0')終止的字串, 指定傳遞給應用程式的命令列引數.

注: 執行引數,例如在命令列鍵入:test.exe /install,那麼程式入口winmain處,其引數lpcmdline就接收到了/install引數。但是,至於你用這個引數做什麼,那是用**實現,你即時對/install引數做了乙個"uninstall"的處理,也是可以的。而實現安裝,這需要根據你的需求加入**,和命令列引數無關。

這個跟命令列的int main(int argc, char* argv)不同

如上文test.exe a b

lpcmdline 為 "a b"

第四個引數ncmdshow指定程式的視窗應該如何顯示, 例如最大化、最小化、隱藏等. 這個引數的值由該程式的呼叫者所指定, 應用程式通常不需要去理會這個引數的值.

注意:c語言的windows api程式設計,並不一定需要使用winmain入口函式。

如果不使用winmain的四個引數,那麼直接使用main代替winmain就完全可以了。

如果程式中使用了winmanin的某個引數,那麼也可以用main替代,但是需要增加winmain的四個引數作為變數,如下所示:

main()

不過有一點要說明的就是getcommandline()函式返回的命令列引數帶有執行程式本身的名字,而winmain的引數lpstr lpcmdline是不包含執行程式的名字本身的。

用main代替winmain除了命令列引數是否包含程式本身名字這一點外,其他未發現不同。

測試一下,就用乙個最簡單程式:

winmain版:

因為winmain

的cmdline

不包含程式名,所以就什麼也沒有顯示。

main版:

用main

代替winmain

除了命令列引數是否包含程式本身名字這一點外,其他未發現不同。

測試了《

windows

程式設計第五版》中的幾個程式,都可以正常執行。

最後補充說明:對於

icmdshow

還可以不在程式中指定,由系統輸入獲得:

startupinfo   startupinfo;   

memset(&startupinfo,0,sizeof(startupinfo));

getstartupinfo(&startupinfo);

icmdshow = (int)startupinfo.wshowwindow;//

獲取視窗顯示模式

另外為了獲得更準確的

cmdline

,可以自編乙個函式,不過我自編的這個函式,會去掉命令列中多餘的空格:

//用這個函式可以返回去掉了多餘空格的

szcmdline

lptstr getcmdline(int argc,char *argv)

{int i=0;

int length=0;

char * cmdline;

if(argc<2)

return text("");

for(i=1; i2)

{for(i=2;i

main函式入口

最近在弄boost test單元測試的時候,遇到了乙個執行程式後就閃退掉的問題,找了好久才發現,原來是沒有進入到boost 自己的main函式中,因為鏈結的其他lib中,有乙個檔案也定義了main函式,編輯器最終是選擇了那個main函式作為程式的入口。在vs下 main函式 通常是 int tmai...

python入口函式

在乙個.py檔案中,如果不是在定義函式,也就是說不是在def關鍵字的內嵌結構內,python會預設其餘部分函式是main函式,並自動執行,但正規工程中,一般都會將main函式寫為 if name main 每個人都在寫,但很少有人問,其實這個用法很巧妙!1 2 3 4 5 6 7 8 hello.p...

jQuery 入口函式

載入模式 js和jquery的區別title 原生js 函式覆蓋問題 js window.onload function ev window.onload function 輸出結果 彈出 hello twojs jquery document ready function document rea...