代码之家  ›  专栏  ›  技术社区  ›  Michael Kelley Franci Penov

以编程方式检查子系统

  •  2
  • Michael Kelley Franci Penov  · 技术社区  · 15 年前

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

    editbin.exe /SUBSYSTEM:CONSOLE my.exe
    

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

    我如何检查我的C++代码中当前子系统是什么?

    3 回复  |  直到 15 年前
        1
  •  8
  •   Michael    15 年前

    子系统类型(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

        2
  •  3
  •   Stu Mackellar    15 年前

    看看 ImageLoad imagehlp库中的函数。返回一个 LOADED_IMAGE 具有 IMAGE_NT_HEADERS 其文件头字段中的结构。此结构中的OptionalHeader字段是 IMAGE_OPTIONAL_HEADER 它有一个包含您想要的信息的子系统文件。

        3
  •  1
  •   MSalters    15 年前

    比在自己的头中插入要容易得多:检查是否有控制台手柄。 对于GUI子系统应用程序, GetStdHandle() 将返回 NULL 把手。