OpenCV學習筆記(2)隱藏 Console 窗口

来源:互联网 发布:unity3d破解版下载 编辑:程序博客网 时间:2024/06/05 06:43

http://blog.csdn.net/chenyusiyuan/article/details/4618962

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

10

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

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

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

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

上述方法是通過設置編譯器的鏈接開關來實現的,所以讓我們來看一下編譯器的鏈接開關選項(也就是 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 (EFI_***): 
這4種 EFI_*** 是和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,可以在 VC6 開發環境的 project->setting->link->project option 或者 VS2005/2008 開發環境的 Project –> Properties -> Configuration Properties –> Linker -> System 中看到!


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

我們知道用 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)中手工改動!


原创粉丝点击