J'ai une DLL tiers que je charge dans des logiciels qui ne sont pas les miens, et j'utilise Alloconsole () pour créer la fenêtre Standard Windows Cli, donc j'ai un moyen facile de produire des messages de débogage. P >
Mon problème est cependant, c'est qu'il ignore tout type d'entrée. Je veux juste pouvoir utiliser la console que j'ai allouée et permet à moi de me donner une entrée. P>
4 Réponses :
Avez-vous également rediriger le J'ai utilisé ce code pour accéder à la sortie Javavm à partir d'une application Windows. P> stdout code> et
starr code> à votre console?
if(::AllocConsole())
{
int hCrt = ::_open_osfhandle((intptr_t) ::GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
FILE *hf = ::_fdopen( hCrt, "w" );
*stdout = *hf;
::setvbuf(stdout, NULL, _IONBF, 0 );
hCrt = ::_open_osfhandle((intptr_t) ::GetStdHandle(STD_ERROR_HANDLE), _O_TEXT);
hf = ::_fdopen( hCrt, "w" );
*stderr = *hf;
::setvbuf(stderr, NULL, _IONBF, 0 );
}
J'ai dirigé le stdout et stardr oui, mais je ne peux toujours pas utiliser la fenêtre CLI pour STDIN. Lorsque j'essaie de régler correctement le stdin, la fenêtre refuse toujours d'être tapé.
Les poignées standard ne sont pas associées à une console créée après le démarrage du programme. Si cela a été fait en premier, le reste de cela pourrait fonctionner.
Ceci est le code qui fonctionne pour moi: Vous pouvez probablement faire quelque chose de similaire avec conin $ code> et
stdin code> (Ouvrir Pour lire, bien sûr). P> p>
Merci à Ben Voigt, j'ai pu faire en sorte que la console soit commise après que je l'ai allouée en faisant:
freopen("CONIN$", "r", stdin); freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr);
Au cas où il aide toute personne, avec VS2013, je n'ai pas pu obtenir la console à fermer via Freeconsole sans "mettre" stdout / stardr: Freopen ("Out", "W", stdout);
freopen ("nul", "w", stdout) code> est meilleur ... "Out" crée un fichier nommé "Out" dans le dossier actuel, alors que NUL est NULL SORTIE, SOULISEZ TOUT.
flight $ code> pourrait être mieux encore ... Je ne sais pas comment ça fonctionne.
Méfiez-vous des problèmes dans Freopen CODE> Mise en œuvre de
UCRT CODE>: 1. Il ne réutilise pas 0-2 descripteurs, pour les réutiliser, vous devez les fermer en premier:
const int stdin_fileno = _fileno (stdin); fclose (stdin); Si (stdin_fileno <0) _close (stdin_fileno); code>. 2. En cas d'application de console non de console (GUI), il ignore
setStdhandle code> (
_dup2 code> l'ignore aussi), vous devez l'appeler à condition de l'appeler.
C'est ce que j'utilise. L'espoir que cela aide quelqu'un. p> p>
Je suppose que cela se trouve sur MS Windows, car
alloconsole code> est une API Microsoft. Retardant de manière appropriée.
Il dit également Windows CLI dans mon message afin qu'aucune hypothèse ne doit être faite. Merci pour le monte.