Matt386 Ответов: 2

Как я могу создать консоль отладки для GUI приложения с помощью чистых вызовов WIN32 API


Я играю с созданием отладочной консоли для приложения WIN32 GUI, и я пытаюсь сделать это по-другому, и клянусь жизнью, я не могу заставить это работать, это такая простая вещь, но она сводит меня с ума. Я знаю, что об этом уже спрашивали миллион раз, и общий способ, которым я пользовался, таков:
AllocConsole();

freopen("CON", "r", stdin);
freopen("CON", "w", stdout);
freopen("CON", "w", stderr);

или также
OutputDebugString(TEXT("blah, blah blah");


Я думаю, что слишком много свободного времени/скуки/любопытства или какой-то странной воли делать вещи самым трудным способом, я хотел попробовать сделать это по-другому с помощью просто чистых вызовов WIN32 с AllocConsole, CreateFile, SetStdHandle. Независимо от того, сколько гуглить или искать через MSDN, я не могу заставить это работать правильно. Все функции возвращаются успешно, и консоль открывается на экране, но нет ввода/вывода.

Что я уже пробовал:

AllocConsole();

HANDLE hConsoleSTDIN = CreateFile("CONIN$", GENERIC_READ | GENERIC_WRITE,
                                  FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);

SetStdHandle(STD_INPUT_HANDLE, hConsoleSTDIN);

HANDLE hConsoleSTDOUT = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE,
                                   FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);

SetStdHandle(STD_OUTPUT_HANDLE, hConsoleSTDOUT);

если я printf() или std::cout, то ничего не отображается.

Любая помощь была бы очень кстати.
Спасибо
Мэтт

11917640 Member

Вы можете изменить параметр /SUBSYSTEM из Windows в консоль (если это вызывает ошибку компоновщика, измените также параметр /ENTRY). Или просто используйте OutputDebugString + DebugView https://docs.microsoft.com/en-us/sysinternals/downloads/debugview

2 Ответов

Рейтинг:
1

Michael Haephrati

Я использую окно консоли для отладки всех моих приложений, с графическим интерфейсом или без него.
В большинстве случаев я использую чистый Win32 API.
Видеть Эта статья[^]
Мало того, что это возможно, но вы можете установить цвета и стили шрифтов.
Во-первых, вы звоните:

#include <conio.h>
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

Чтобы задать цвет текста, я использую:
inline void setcolor(int textcol, int backcol)
{
	if ((textcol % 16) == (backcol % 16))textcol++;
	textcol %= 16; backcol %= 16;
	unsigned short wAttributes = ((unsigned)backcol << 4) | (unsigned)textcol;
	CONSOLE_SCREEN_BUFFER_INFO csbi;
	SetConsoleTextAttribute(hConsole, wAttributes);
}

Тогда просто используйте wprintf() для отображения текста.
Если вы хотите очистить область отображения, просто позвоните:
system("cls");

Также обновите дисплей, позвонив по телефону:
void refresh()
{
	HWND hwnd = FindWindowEx(NULL, NULL, L"CabinetWClass", NULL);
	while (hwnd != NULL)
	{
		PostMessage(hwnd, WM_COMMAND, 41504, 0);
		hwnd = FindWindowEx(NULL, hwnd, L"CabinetWClass", NULL);
	}
}