OpenCV學習:隱藏 Console 窗口

 

在VC++中使用OpenCV,通常是創建一個 win32 console application 項目,當運行此類程序的時候,默認狀況下會有一個相似DOS窗口的console窗口,供程序與用戶之間交互之用。 windows

可是有時候咱們只想在程序中運行一段功能代碼,不但願顯示這個 console 窗口,而是讓代碼執行完畢以後程序自動退出。隱藏這種 win32 console application 的 console 窗口,主要有兩種方式:架構

一、經過#pragma指令來修改,即在main函數前添加如下一行代碼: 

        #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )app

二、經過設置項目屬性來修改,即在 Project –> Properties -> Configuration Properties –> Linker -> System 的 Subsystem 項中,將 Console (/SUBSYSTEM:CONSOLE) 修改成 Console (/SUBSYSTEM:WINDOWS) ,這樣就把控制檯程序窗口隱去了。函數

上述方法是經過設置編譯器的連接開關來實現的,因此讓咱們來看一下編譯器的連接開關選項(也就是 linker 選項)。spa

1、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 (EFI_***): 
這4種 EFI_*** 是和CPU具體架構相關的參數選項,並不經常使用,有興趣的能夠訪問 intel 主頁來查看相關內容。io

—— NATIVE: 
設備驅動器選項,若是 /DRIVER:WDM 選項被設定的話,該連接選項(NATIVE)就爲默認選項。console

—— 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,能夠在 VC6 開發環境的 project->setting->link->project option 或者 VS2005/2008 開發環境的 Project –> Properties -> Configuration Properties –> Linker -> System 中看到!


2、應用程序是如何運行的! 

咱們知道用 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 –> Properties -> Configuration Properties –> Linker -> System (VS2005/08)中看到,其中的 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 –> Properties -> Configuration Properties –> Linker -> System (VS2005/08)中手工改動!

相關文章
相關標籤/搜索