Exécutez l’application de console non gérée C ++ (PAS un fichier de commandes) sans fenêtre

Afin d’éviter de se mêler aux services d’interopérabilité (au-delà de ma compréhension), j’utilise

spawnl(P_DETACH, MyPath, "MyProg.exe", 0); 

pour générer un projet de ligne de commande C ++ non géré VS. (Il contrôle une astro-caméra via la DLL du fabricant).

Je n’ai pas besoin d’une fenêtre (je parle à myprog.exe en utilisant des canaux nommés de mon programme d’interface graphique principal).

La suppression de la fenêtre à partir d’une interface graphique est sortingviale, mais pour éviter les problèmes de regroupement (au-delà de ma compréhension), myprog.exe doit être un projet de ligne de commande C ++ natif non géré , pas un projet CLI.

Il existe une documentation abondante sur la suppression de la fenêtre à partir d’un fichier de commandes ou de Python, et la fermeture d’une fenêtre dans un projet Windows est sortingviale, mais cela n’est pas pertinent ici.

J’ai engendré myprog.exe détaché, mais ce n’est pas pertinent. Fermer le handle de la console s’exécute bien mais ne ferme pas la fenêtre.

Avez-vous des idées sur la manière de ne jamais ouvrir la boîte DOS noire à l’écran ou de la fermer sans fermer myprog.exe?

Essayez quelque chose comme ça:

 #define WIN32_LEAN_AND_MEAN #include  #include  void system_error(char *name) { // Resortingeve, format, and print out a message from the last errror. // The `name' that's passed should be in the form of a present tense // noun (phrase) such as "opening file". // char *ptr = NULL; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 0, (char *)&ptr, 1024, NULL); printf("\nError %s: %s\n", name, ptr); LocalFree(ptr); } PROCESS_INFORMATION p; BOOL WINAPI die(DWORD reason) { TerminateProcess(p.hProcess, 1); return TRUE; } int main(int argc, char **argv) { STARTUPINFO s; memset(&s, 0, sizeof s); s.cb = sizeof(s); if (!CreateProcess(argv[1], argv[2], NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &s, &p)) { system_error("Spawning program"); return 1; } SetConsoleCtrlHandler(die, TRUE); WaitForSingleObject(p.hProcess, INFINITE); return 0; }