關於main與wmain函數


最近寫一個控制台程序,並且希望該控制台程序運行時不顯示控制台窗口,於是在程序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){

  }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM