最近寫一個控制台程序,並且希望該控制台程序運行時不顯示控制台窗口,於是在程序include語句下面加入如下代碼
#pragma comment (linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
而原先的控制台程序入口為int wmain(int argc, _TCHAR* argv[]),必須要改為main才能編譯通過
但是問題來了,原來運行沒問題的代碼,現在出問題了
if ((argc > 1) && ((*argv[1] == L'-') || (*argv[1] == L'/'))){
if (__wcsicmp(L"set", argv[1] + 1) == 0){
}
}
通過打印,調試后發現,我在控制台中輸入命令***.exe /set,argv[1] + 1 讀取到的內容為et,
而在int wmain(int argc, _TCHAR* argv[])函數中argv[1] + 1 讀取到的內容為set。Why?
后來查了一下這兩個函數的區別,發現有如下特點:
1、main()是WINDOWS的控制台程序(32BIT)或DOS程序(16BIT),
2、WinMain()是WINDOWS的GUI程序,
3、 wmain()是UNICODE版本的main(),wmain也是main的另一個別名,是為了支持二個字節的語言環境
4、_tmain()是個宏,如果是UNICODE則他是wmain()否則他是main()
因此分析,在main(int argc, _TCHAR* argv[])和wmain(int argc, _TCHAR* argv[])兩種情況下
同樣輸入***.exe /set
wmain中argv[1] = "/" ,占兩個字節
main中argv[1] = "/s" ,占兩個字節
argv[1]均是雙字節變量,而在wmain入口中,用戶的輸入字符,每個字符按UNICODE方式存儲,
而在main入口中,用戶的輸入字符,每個字符按ANSCII方式存儲。
因此修改如下:
if ((argc > 1) && ((*argv[1] == L'-') || (*argv[1] == L'/'))){
if (_stricmp("set", argv[1] + 1) == 0){
}
}
