#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) // 設置入口地址 在控制檯程序中隱藏控制檯窗口! 你們都知道,當編寫一個win32 console application時,當運行此類程序的時候 默認狀況下會有一個相似DOS窗口的console窗口,可是有的時候咱們只想在程序 中運行一段功能代碼,不但願顯示這個console窗口,讓代碼執行完畢以後程序自 動退出.
下面就介紹一下,如何隱藏win32 console application的console窗口
由於此種方法是經過設置編譯器的連接開關來實現,因此讓咱們來看一下編譯 器的連接開關選項(也就是linker選項).
首先咱們來看一下linker的 /subsystem 選項
該選項的語法形式以下: /SUBSYSTEM:{CONSOLE|EFI_APPLICATION|EFI_BOOT_SERVICE_DRIVER| EFI_ROM|EFI_RUNTIME_DRIVER|NATIVE|POSIX|WINDOWS|WINDOWSCE} [,major[.minor]]
這個連接選項告訴操做系統如何運行可執行文件
CONSOLE: win32 字符模式應用程序,此種類型的應用程序在運行的時候會產生一個相似DOS 窗口的控制檯窗口,若是在應用程序的主函數爲main()或者wmain(),在默認狀況下 該應用程序就是一個控制檯應用程序
Extensible Firmware Interface 和CPU具體架構相關的一個參數選項,並不經常使用,在這裏暫不詳細介紹. 若是對此有興趣的能夠訪問intel主頁來查看相關內容
NATIVE; 設備驅動器選項,若是/DRIVER:WDM選項被設定的話,該連接選項(NATIVE)就爲默認選項
POSIX: 在windows NT 種運行在POSIX子系統上的應用程序
WINDOWS: 該類型的應用程序不產生console窗口,該類型的應用程序的窗口由用戶本身建立,簡而言之 就是一個標準的Win32 application,其入口地址爲WinMain()函數或者wWinMain()函數的地址 若是你在應用程序種定義的主函數爲WinMain或者wWinMain,在默認狀況下該應用程序就是一個 Win32 Application !
WINDOWSCE: 運行在windows CE上的應用程序
major and minor (optional): 主版本號和次版本號,該選項爲可選,該選項爲0~65535之間的十進制整數
從上面能夠看出若是咱們創建一個win32 console application的話,linker的/subsystem選項應該爲 CONSOLE,能夠在VC開發環境的project->setting->link->project option中看到!
接下來咱們再看看應用程序是如何運行的! 咱們知道用VC編寫的程序,運行的時候是須要 C\C++運行庫支持的.當咱們運行一個C/C++程序的時候 連接器會首先尋找應用程序的啓動函數,例如: 若是你創建了一個console程序的話,編譯器得連接開關會是如下這種形式 /subsystem:"console" /entry:"mainCRTStartup" (ANSI) /subsystem:"console" /entry:"wmainCRTStartuup" (UNICODE)
若是你創建了一個win32 application,編譯器得連接開關則會是一下形式 /subsystem:"windows" /entry:"WinMain" (ANSI) /sbusystem:"windows" /entry:"wWinMain" (UINCODE)
上面的兩種形式能夠再project->setting->link->project option中看到 上面的subsystem和entry並不須要都設置,若是你只設置了/subsystem:"console" 的話,那麼默認的entry開關在默認狀況下應爲/entry:"mainCRTStartup" 反之,若是你在應用程序中定義了main函數的話,默認狀況下,你的/subsystem開關 應該爲/system:"console"
在默認狀況下/subsystem 和/entry開關是匹配的,也就是 console對應mainCRTStartup或者wmainCRTStartup windows對應WinMain或者wWinMain
可是咱們也能夠經過手動改動的方式使他們不匹配
例如咱們能夠這樣改動
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) // 設置入口地址
int main(int argc, char* argv[]) { MessageBox(NULL, "hello", "Notice", MB_OK); return 0; }
在默認狀況下連接器看到/subsystem下是windows選項的時候,它會自動尋找WinMain或者wWinMain
但咱們強制指定入口地址,這樣運行程序的時候默認的console窗口就會隱藏!
上面是在代碼中使用#pragma指令來設置,還有一種就是直接在開發環境的 project->setting->link->project option中手工改動!app
解決方案二:函數 那就是直接在EXE文件中將PE文件頭的Subsystem從3改爲2。在EXE文件中,PE文件頭的偏移地址是0x3c,Subsystem是一個WORD,它在PE文件頭中的偏移是0x5c操作系統 註釋:開發 LINK的時候須要指定/subsystem,這個連接選項告訴Windows如何運行可執行文件。編譯器 控制檯程序是/subsystem:"console"it 其它程序通常都是/subsystem:"windows " 將 subsystem 選成"console"後,Windows在進入可執行文件的代碼前(如mainCRTStartup),就會產生一個控制檯窗口。io 如 果選擇"windows",操做系統就不產生console窗口,該類型應用程序的窗口由用戶本身建立。 可執行文件都有一個Entry Point,LINK時能夠用/entry指定。缺省狀況下,若是subsystem是「console」,Entry Point是 mainCRTStartup(ANSI)或wmainCRTStartuup(UNICODE),即:console /subsystem:"console" /entry:"mainCRTStartup" (ANSI) /subsystem:"console" /entry:"wmainCRTStartuup" (UNICODE) |