программно проверить подсистему - PullRequest
2 голосов
/ 17 сентября 2009

У меня есть .exe, созданный с помощью подсистемы Windows. Я копирую этот .exe в другой .exe и запускаю:

editbin.exe /SUBSYSTEM:CONSOLE my.exe

Таким образом, я намерен иметь .exe, который работает с графическим интерфейсом, и другой .exe, предназначенный для операций командной строки (без графического интерфейса).

Как проверить, какая подсистема в настоящее время активна в моем коде C ++?

Ответы [ 3 ]

8 голосов
/ 17 сентября 2009

Тип подсистемы (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

3 голосов
/ 17 сентября 2009

Посмотрите на функцию ImageLoad в библиотеке Imagehlp. Это возвращает структуру LOADED_IMAGE , которая имеет структуру IMAGE_NT_HEADERS в своем поле FileHeader. Поле OptionalHeader в этой структуре представляет собой IMAGE_OPTIONAL_HEADER , в котором есть подсайт, содержащий требуемую информацию.

1 голос
/ 18 сентября 2009

Гораздо проще, чем писать в своих заголовках: проверьте, есть ли у вас дескрипторы консоли. Для приложения с подсистемой GUI GetStdHandle() вернет дескрипторы NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...