vérification par programme du sous-système

J’ai un fichier .exe créé avec un sous-système Windows. Je copie ce fichier .exe sur un autre fichier .exe et je lance:

editbin.exe /SUBSYSTEM:CONSOLE my.exe 

Mon intention est donc d’avoir un fichier .exe qui s’exécute avec une interface graphique, et un autre fichier .exe destiné aux opérations de ligne de commande (pas d’interface graphique).

Comment vérifier quel sous-système est actuellement actif dans mon code C ++?

Le type de sous-système (interface graphique, console, etc.) est stocké dans l’en-tête PE, auquel vous pouvez accéder via les fonctions ImageHlp. Vous pouvez l’obtenir avec le code suivant:

 // Resortingeve 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. } 

Entrées MSDN pertinentes:

ImageNtHeader IMAGE_NT_HEADERS IMAGE_OPTIONAL_HEADER

Regardez la fonction ImageLoad dans la bibliothèque Imagehlp. Cela retourne une structure LOADED_IMAGE qui a une structure IMAGE_NT_HEADERS dans son champ FileHeader. Le champ OptionalHeader de cette structure est un IMAGE_OPTIONAL_HEADER dans lequel un sous-système a été enregistré contenant les informations souhaitées.

Bien plus facile que le spéléologie dans vos propres en-têtes: vérifiez si vous avez des poignées de console. Pour une application de sous-système GUI, GetStdHandle() renverra les poignées NULL .