7
votes

Utiliser STDIN avec un allocation ()

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.

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.


2 commentaires

Je suppose que cela se trouve sur MS Windows, car alloconsole 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.


4 Réponses :


2
votes

Avez-vous également rediriger le stdout code> et starr code> à votre console?

J'ai utilisé ce code pour accéder à la sortie Javavm à partir d'une application Windows. P>

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 );
    }


2 commentaires

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.



2
votes

Ceci est le code qui fonctionne pour moi: xxx

Vous pouvez probablement faire quelque chose de similaire avec conin $ et stdin (Ouvrir Pour lire, bien sûr).


0 commentaires

15
votes

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); 


3 commentaires

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) est meilleur ... "Out" crée un fichier nommé "Out" dans le dossier actuel, alors que NUL est NULL SORTIE, SOULISEZ TOUT. flight $ pourrait être mieux encore ... Je ne sais pas comment ça fonctionne.


Méfiez-vous des problèmes dans Freopen Mise en œuvre de UCRT : 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); . 2. En cas d'application de console non de console (GUI), il ignore setStdhandle ( _dup2 l'ignore aussi), vous devez l'appeler à condition de l'appeler.



2
votes

C'est ce que j'utilise. XXX

L'espoir que cela aide quelqu'un.


0 commentaires