Comment puis-je obtenir de sortie de la console en C++ avec un programme Windows?
Si j'ai un natif C++ programme windows (c'est à dire le point d'entrée est WinMain) comment puis-je afficher la sortie de la console, comme les fonctions des std::cout?
- Êtes-vous essayer de lire votre sortie ou d'une autre, les demandes de sortie?
Vous devez vous connecter pour publier un commentaire.
Découvrez L'ajout de la Console I/O d'une GUI Win32 Application. Cela peut vous aider à faire ce que vous voulez.
Si vous n'avez pas, ou ne pouvez pas modifier le code, essayez les suggestions trouvé ici pour rediriger la sortie de la console dans un fichier.
Edit: peu de fil de la nécromancie ici. J'ai d'abord répondu à cette 9ish il y a des années, dans les premiers jours de la SORTE, avant le (bon) politique de non-link-seules réponses sont entrées en vigueur. Je vais reposter le code de l'article original dans l'espoir d'expier mes péchés passés.
guicon.cpp -- Une redirection de la console de fonction
guicon.h -- Interface pour la redirection de console de la fonction
test.cpp -faisant preuve d'une redirection de console
Vous pouvez également rouvrir le cout et eree flux de sortie vers un fichier. Les éléments suivants doivent travailler pour cela:
À l'aide d'une combinaison de la réponse de luc et Roger réponse ici a travaillé pour moi dans mon Bureau Windows de l'Application du projet.
ios::sync_with_stdio
n'est pas nécessaire. En outre, il provoque des troisFILE
instances alloué là avec_fdopen
appels fuite parce que c'est un sortie argument pourfreopen_s
.la création d'un tuyau, d'exécuter le programme de la console de CreateProcess() et de lire avec ReadFile() ou écrit dans la console WriteFile()
}
Si vous envoyez la sortie de votre programme vers un fichier ou un tuyau, par exemple
ou vous exécutez votre programme à partir d'un autre programme et à la capture de sa sortie par l'intermédiaire d'un tuyau, alors vous n'avez pas besoin de changer quoi que ce soit. Le tout fonctionne, même si le point d'entrée est
WinMain
.Toutefois, si vous exécutez votre programme dans une console ou dans Visual Studio, puis la sortie n'apparaît pas dans la console ou dans la fenêtre de Sortie de Visual Studio. Si vous voulez voir la sortie de "live", puis essayez l'une des autres réponses.
Fondamentalement, cela signifie que la sortie standard, fonctionne exactement comme avec les applications de console, mais il n'est pas connecté à une console dans laquelle vous exécutez votre application, et il semble y avoir aucun moyen facile de le faire (toutes les autres solutions présentées ici de connecter la sortie d'une nouvelle console fenêtre pop-up lorsque vous exécutez votre application, même à partir d'une autre console).
Ne pas me citer sur ce point, mais le Win32 console API peut-être ce que vous cherchez. Si vous êtes en train de faire ce pour des fins de débogage, cependant, vous pourriez être plus intéressé DebugView et l'appel de la DbgPrint fonction.
Cela suppose bien sûr son de votre application que vous souhaitez l'envoi de sortie de la console, pas de le lire à partir d'une autre application. Dans ce cas, les tuyaux peuvent être votre ami.
DbgPrint
il détient queOnly kernel-mode drivers can call the DbgPrint routine.
. Donc probablement pas ce que la plupart des gens veulentAller de Projet>Propriétés de Projet>Linker>Système et dans le volet de droite, définissez sous-systèmes option pour Console(/SUBSYSTEM:CONSOLE)
Puis compiler votre programme et l'exécuter à partir de la console pour voir si vous l'invite de commande indique vos sorties ou pas.
En fait il existe une solution beaucoup plus simple que de tout projet de mesure. Votre programme de Windows aura une fonction WinMain donc, il suffit d'ajouter ce "factice" fonction principale ainsi
Vous pouvez maintenant compiler à l'aide de MSVC comme ce
(vous devrez peut-être ajouter plus de bibliothèque de liens)
Lorsque vous exécutez le programme,
printf
sera écrit à l'invite de commande.Si vous utilisez gcc (mingw) de compiler pour Windows, vous n'avez pas besoin d'un mannequin fonction principale, il suffit de faire
(c'est à dire éviter d'utiliser le
-mwindows
drapeau qui va empêcher l'écriture à une console. Le drapeau sera utile lorsque vous créez la dernière GUI de presse) Encore une fois, vous pouvez avoir besoin de spécifier plus de bibliothèques si vous utilisez plus des fonctionnalités de windows)Passé toute la journée d'aujourd'hui en essayant de le faire fonctionner correctement. Trouvé des réponses sur le web qui ressemblent à des luc et Sev de.
La méthode fonctionne, mais le problème vient quand je l'ai sortie de la console, soit par des appels de
FreeConsole
ou tout simplement l'arrêt de l'application normalement. En mode debug, je vois debug assertions à propos de fichier non valide poignées dans le CRT code de nettoyage.Je pense que le problème est causé en partie par le trop compliqué rediriger les processus que tout le monde utilise, et en partie parce que la norme IO flux ne sont pas redirigés avant de quitter.
Je ne comprends pas du tout le besoin d'utiliser
_open_osfhandle
et_fdopen
dans ce processus.C'est la solution complète qui fonctionne pour moi:
La redirection de la Console de Standard IO:
Libérant une Console:
Redimensionnement De La Console De La Mémoire Tampon:
L'allocation d'une Nouvelle Console:
Fixation à la Mère de la Console:
Appel de WinMain:
Lien avec
/SUBSYSTEM:Windows
Car il n'y a pas de fenêtre de console, c'est
impossibledifficile. (Apprendre quelque chose de nouveau chaque jour - je n'ai jamais su sur les fonctions de la console!)Est-il possible pour vous de remplacer votre sortie d'appels? Je vais souvent utiliser TRACE ou OutputDebugString pour envoyer des informations à la sortie de Visual Studio fenêtre.
WINDOWS
vsCONSOLE
). Visual Studio utilise que de l'éditeur de liens paramètre de contrôle, fourni par l'utilisateur point d'entrée, le CRT du code de démarrage des appels en.Comme mentionné il y et il y la solution la plus simple est d'utiliser vos Pages de propriétés du Projet pour alterner entre
CONSOLE
etWINDOWS
SubSytems pour activer ou désactiver la sortie de la console à volonté.Votre programme aura juste besoin
main
etWinMain
points d'entrée pour s'assurer à la fois la configuration de la compilation.Le
main
fonction appelant simplementWinMain
comme indiqué ci-dessous par exemple: