zz:控制檯程序後臺運行

控制檯程序後臺運行windows

2010-07-10 07:06 P.M.架構

#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)

相關文章
相關標籤/搜索