Comment puis-je rediriger stdout pour certains d'affichage visible dans une Application Windows?
J'ai accès à une bibliothèque tierce qui n'a de "bonnes choses". Il émet l'état et l'évolution des messages sur la sortie standard stdout. Dans une application de Console je vois ces messages de l'amende juste. Dans une application Windows, ils ont juste aller le seau bits.
Est-il une manière assez simple de redirection de stdout et stderr vers un contrôle de texte ou d'un autre endroit visible. Idéalement, cela n'aurait besoin d'aucune recompilation du code tiers. Il serait juste d'intercepter les vapeurs à un faible niveau. J'aimerais une solution où je viens de #inclure l'en-tête, appeler la fonction d'initialisation et de lier la bibliothèque comme dans...
#include "redirectStdFiles.h"
void function(args...)
{
TextControl* text = new TextControl(args...);
initializeRedirectLibrary(text, ...);
printf("Message that will show up in the TextControl\n");
std::cout << "Another message that also shows up in TextControl\n";
}
Serait encore mieux si elle utilisait une interface que j'ai pu la remplacer si elle n'est pas liée à un quelconque bibliothèque d'interface graphique.
class StdFilesRedirector
{
public:
writeStdout(std::string const& message) = 0;
writeStderr(std::string const& errorMessage) = 0;
readStdin(std::string &putReadStringHere) = 0;
};
Suis-je en train de rêver? Ou quelqu'un sait-il quelque chose qui peut faire quelque chose de ce genre?
Modifier après deux réponses: je pense que l'utilisation d'freopen pour rediriger les fichiers est une bonne première étape. Pour une solution complète, il faudrait un nouveau fil de discussion créé pour lire le fichier et afficher le résultat. Pour le débogage, faire un "tail-f" dans une fenêtre shell cygwin serait suffisant. Pour une plus poli de l'application... Qui est ce que je veux écrire... il y aura un peu de travail supplémentaire à la création du thread, etc.
AllocConsole
est la pièce manquante. Il produit les familiers de la fenêtre de la console. La lire et écrire les fonctions sont difficiles à faire, mais vous pouvez rediriger la sortie standard stdout/stdin vers/depuis assez facilement à l'aide de cette méthode: stackoverflow.com/a/15547699/133836
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour créer de la pipe (avec CreatePipe()), puis de brancher la sortie standard à la fin d'écriture avec SetStdHandle(), puis vous pouvez lire à partir du tuyau de lire la fin avec ReadFile() et de mettre le texte que vous obtenez à partir de là où vous le souhaitez.
Vous pouvez rediriger la sortie standard stdout, stderr et stdin à l'aide de freopen.
À partir du lien ci-dessus:
Vous pouvez également exécuter votre programme via l'invite de commande comme suit:
Vous êtes probablement à la recherche de quelque chose le long de ces lignes:
Cette classe va le faire:
Voici le résultat:
Lorsque vous créez un processus à l'aide de La fonction CreateProcess() vous pouvez choisir un
HANDLE
à qui stdout et stderr sont va être écrit. CetteHANDLE
peut être un fichier pour lequel vous indiquer la sortie.Cela vous permettra d'utiliser le code sans le recompiler. Juste l'exécuter et au lieu d'utiliser
system()
ou autres joyeusetés, l'utilisationCreateProcess()
.La POIGNÉE que vous donnez à
CreateProcess()
peut également être celle d'un tuyau que vous avez créé, et puis vous pouvez lire à partir de la pipe et de faire autre chose avec les données.Vous pourriez faire quelque chose comme ça avec cout ou eree:
Ou, vous pouvez le faire avec un
std::stringstream
ou une autre classe dérivée destd::ostream
.Pour rediriger stdout, vous auriez besoin de rouvrir le descripteur de fichier. Ce fil a quelques idées de cette nature.
Ici, nous allons définir un nouveau point d'entrée
consoleMain
qui prend le pas sur votre propre.defaultMain
.Quelque part dans votre code source déclarer le point d'entrée d'origine (on peut la chaîne) et le nouveau point d'entrée. Les deux doivent être déclarés
extern "C"
pour éviter name mangling.Mettre en œuvre la fonction de point d'entrée.
Ajouter votre code de test quelque part, par exemple en un clic sur un bouton d'action.
consoleMain
comme nouveau point d'entrée (Propriétés du Projet/de l'éditeur de liens/Avancé/Point d'Entrée).C'est ce que je ferais:
Grâce à la gamedev lien dans la réponse greyfade, j'ai été capable d'écrire et de tester ce simple morceau de code
Il fonctionne et est adéquat pour le débogage. L'obtention de texte en plus de l'interface graphique attrayante élément prendrait un peu plus de travail.