2009-02-22 114 views

回答

62

唯一的區別是,如果控制檯應用程序不是從一個控制檯啓動(或者在啓動時主動禁用控制檯),則該控制檯應用程序始終會生成控制檯。另一方面,Windows應用程序不生成控制檯。它可以仍附加到一個存在的控制檯或使用AllocConsole創建一個新的控制檯。

這使得Windows應用程序更適合GUI應用程序或後臺應用程序,因爲您通常不希望爲這些應用程序創建終端窗口。

在更多技術說明中,控制檯和Windows可執行文件之間的唯一區別是exe文件的PE標頭中的一個字節。手動切換此字節(例如,使用十六進制編輯器)可轉換應用程序類型。這是一個用於在VB6中創建控制檯應用程序的良好發佈的hack(其中未明確支持此類應用程序)。

要確定和更改應用程序的子系統類型,您需要閱讀PE標頭的各個部分。子系統數據的地址不是固定的,因爲它是可選文件頭的一部分,其位置由存儲在DOS文件頭中的地址(在成員e_lfanew中)確定。該地址實際上指向_IMAGE_NT_HEADERS記錄,該記錄又包括IMAGE_OPTIONAL_HEADER32結構。這有一個int161)成員稱爲Subsystem。 Windows應用程序的成員值爲2,控制檯應用程序的成員值爲3。其他子系統存在(特別是POSIX和內核)。 我已經寫了一個小的VB6應用程序來更改應用程序的子系統,它可以從ActiveVB作爲源代碼下載。

PE格式沒有很好的記錄,但是這個文件可以作爲一個介紹:Peering Inside the PE: A Tour of the Win32 Portable Executable File Format


1)這並沒有真正否認我的要求只有一個字節的區別:此成員的最顯著字節始終爲0,只有至少顯著字節的變化。

當您啓動控制檯應用程序,命令提示符不會返回到控制檯應用程序退出:

+0

感謝康拉德的子系統 - 偉大的:-) – 2009-02-22 13:24:33

1

控制檯應用程序從Windows命令行運行(開始/運行/ CMD)

一個窗口應用程序預設,所以你可以編寫在Windows環境中運行的GUI應用程序。

15

除了由康拉德·提到的區別,在命令提示符下交互調用時控制檯和Windows應用程序的行爲不同。 當您啓動一個Windows應用程序時,該命令立即返回。

這對於批處理文件不是這樣;他們會一直等到應用程序退出。 (您始終可以使用start命令無需等待即可啓動應用程序。)

2

區別在於應用程序已被刪除。當您使用控制檯模板時,您將有一個存根將在控制檯中啓動。如果您已經在控制檯中運行,它將忽略打開一個控制檯的呼叫。

同樣,一個Windows應用程序是用默認的窗體設計的。如果你想清除它,你可以創建一個無窗口的Windows窗體應用程序,它本質上是一個沒有控制檯窗口的控制檯應用程序。

就應用程序的膽量而言,它們本質上是一樣的。主要區別是在編譯階段添加。

相關問題