Tout d'abord, je ne suis pas un programmeur Windows (pas même un utilisateur Windows), j'utilise le compilateur croisé sous Linux pour construire aussi Win32 et Win64. Après avoir creusé le Net (et même posé une question ici), j'ai réussi à assembler un fragment de code qui peut ouvrir une console Windows, et l'utiliser pour stdin/stdout/stderr. Cela fonctionne bien avec Win32, mais le programme se bloque sur Win64. Je suppose que le problème est la taille du type de données entier long différent, gcc même avertit à ce sujet. Cependant, étant donné que je ne connais pas le but exact et la taille de certains types d'API Windows, je ne peux pas savoir ce que je devrais changer. Sûrement, le meilleur serait une solution indépendante win32/win64. J'ai aussi essayé d'utiliser le type "HANDLE" pour lStdHandle mais ensuite il ne compile pas. Quelqu'un peut-il aider à ce sujet?Ouverture de la console Windows pour stdin/stdout/stderr pour win32 et win64 en C
int hConHandle;
long lStdHandle;
//HANDLE lStdHandle;
CONSOLE_SCREEN_BUFFER_INFO coninfo;
FILE *fp;
FreeConsole(); // be sure to release possible already allocated console
if (!AllocConsole()) {
ERROR_WINDOW("Cannot allocate windows console!");
return;
}
SetConsoleTitle("My Nice Console");
// set the screen buffer to be big enough to let us scroll text
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
coninfo.dwSize.Y = 1024;
//coninfo.dwSize.X = 100;
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
// redirect unbuffered STDOUT to the console
lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen(hConHandle, "w");
*stdout = *fp;
setvbuf(stdout, NULL, _IONBF, 0);
// redirect unbuffered STDIN to the console
lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen(hConHandle, "r");
*stdin = *fp;
setvbuf(stdin, NULL, _IONBF, 0);
// redirect unbuffered STDERR to the console
lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
fp = _fdopen(hConHandle, "w");
*stderr = *fp;
setvbuf(stderr, NULL, _IONBF, 0);
// Set Con Attributes
//SetConsoleTextAttribute(GetStdHandle(STD_ERROR_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);
SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT);
SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT);
Avez-vous débogué? Où se bloque-t-il? – Peanut
Il fonctionne pour ma compilation dans Visual Studio 2017. Vous devez également vérifier les valeurs de retour à partir des fonctions. – Peanut
En fait, je ne peux pas déboguer, puisque je ne peux même pas essayer, je n'ai pas de fenêtres, juste demandé à quelqu'un de l'essayer. Il a été compilé sous Linux avec les fenêtres de ciblage du compilateur Mingw. L'exe 32 bits semble être OK, seulement pour 64 bits est le problème. Certes, ce n'est pas si bien que j'ai un problème, je ne peux pas trop déboguer, mais la plupart de mon projet est indépendant de la plate-forme de toute façon (win32/win64/OSX/Linux/etc), juste de petites choses comme ça. –