以编程方式检查子系统

时间:2009-09-17 17:06:06

标签: c++ windows

我有一个用windows子系统创建的.exe。我将.exe复制到另一个.exe,然后运行:

editbin.exe /SUBSYSTEM:CONSOLE my.exe

所以我的目的是让一个运行GUI的.exe和另一个用于命令行操作的.exe(没有GUI)。

如何检查我的C ++代码中当前处于活动状态的子系统?

3 个答案:

答案 0 :(得分:8)

子系统类型(GUI,控制台等)存储在PE头中,您可以通过ImageHlp函数访问它。您可以使用以下代码获取它:

// Retrieve the header for the exe.  GetModuleHandle(NULL) returns base address
// of exe.
PIMAGE_NT_HEADERS header = ImageNtHeader((PVOID)GetModuleHandle(NULL));
if (header->OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI)
{
    // Console application.
}

重新发布MSDN条目:

ImageNtHeader IMAGE_NT_HEADERS IMAGE_OPTIONAL_HEADER

答案 1 :(得分:3)

查看Imagehlp库中的ImageLoad函数。这将返回LOADED_IMAGE结构,该结构在其FileHeader字段中具有IMAGE_NT_HEADERS结构。此结构中的OptionalHeader字段是IMAGE_OPTIONAL_HEADER,其中包含一个包含所需信息的Subsytem字段。

答案 2 :(得分:1)

比在自己的标题中使用更容易:检查你是否有控制台句柄。 对于GUI子系统应用程序,GetStdHandle()将返回NULL个句柄。