проблема
Мне было легко найти способ установки цветов консоли в C ++ с использованием windows.h и std :: cout. Один такой метод показан здесь:
HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE); //get handle of console
CONSOLE_SCREEN_BUFFER_INFO bufferInfo;
GetConsoleScreenBufferInfo(stdout, &bufferInfo); //save current color scheme
SetConsoleTextAttribute(stdout, 0x4); //change console color
std::cout << "This is red text" << std::endl;
SetConsoleTextAttribute(stdout, bufferInfo.wAttributes); //restore old colors
Конечно, когда я запускаю свою программу из окна консоли, цвета меняются, как и ожидалось. Проблема в том, что когда он запускается из сценария msbuild, я использую exec:
<Exec Command="myExecutable.exe" />
При запуске из скрипта msbuild программа не влияет на цвета. Текст по-прежнему выводится при вызове std :: cout, но это просто обычные цвета окна консоли.
гипотеза
Я предполагаю, что вызов exec пишет в стандартный вывод с помощью другого дескриптора, чем STD_OUTPUT_HANDLE. Либо так, либо msbuild exec устанавливает свои собственные атрибуты консоли. Я пытался получить родительскую консоль, но мне не повезло.
Есть идеи?
Скорее всего, MSBuild соединяет ваш исполняемый файл с каналом. Когда вы записываете что-то в канал, MSBuild читает его с другого конца, тогда он может выполнять некоторую обработку: например, запись на экран, в журналы и т. Д. Проблема в том, что вы не можете передавать цвета через канал. На самом деле вы можете проверить, что ваш stdout
дескриптор не консольный буфер, использующий GetFileType
, который вернется FILE_TYPE_CHAR
для консоли, но FILE_TYPE_PIPE
если моя гипотеза верна. Вы также должны проверить, успешно ли выполнялись вызовы вашей консольной функции.
Других решений пока нет …