Windows C ++: Как я могу перенаправить stderr для вызовов к fprintf?

Причины, почему селекторы на основе id не работают

  1. Элемент / DOM с указанным идентификатором еще не существует.
  2. Элемент существует, но он не является зарегистрированный в DOM [в случае, если HTML-узлы динамически добавляются из ответов Ajax].
  3. Присутствует более одного элемента с тем же идентификатором, который вызывает конфликт.

Решения

  1. Попробуйте получить доступ к элементу после его объявления или, альтернативно, использовать такие вещи, как $(document).ready();
  2. . Для элементов, исходящих из ответов Ajax, используйте метод .bind() для jQuery. В старых версиях jQuery для этого было .live().
  3. Используйте инструменты [например, плагин webdeveloper для браузеров], чтобы найти дубликаты идентификаторов и удалить их.
5
задан Onur A. 13 March 2018 в 17:20
поделиться

3 ответа

Можно использовать подобную технику в Windows, просто необходимо использовать другие слова для тех же понятий.:) Эта статья: http://msdn.microsoft.com/en-us/library/ms682499.aspx использует канал win32 для обработки ввода-вывода от другого процесса, просто необходимо сделать то же самое с потоками в рамках того же процесса. Конечно, в Вашем случае весь вывод к stderr отовсюду в процессе будет перенаправлен Вашему потребителю.

На самом деле другие части загадки, в которой Вы, возможно, нуждаетесь, являются _fdopen и _open_osfhandle. На самом деле вот связанный пример из некоторого кода, который я выпустил несколько лет назад:

DWORD CALLBACK DoDebugThread(void *)
{
    AllocConsole();
    SetConsoleTitle("Copilot Debugger");
    // The following is a really disgusting hack to make stdin and stdout attach
    // to the newly created console using the MSVC++ libraries. I hope other
    // operating systems don't need this kind of kludge.. :)
    stdout->_file = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
    stdin->_file  = _open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE), _O_TEXT);
    debug();
    stdout->_file = -1;
    stdin->_file  = -1;
    FreeConsole();
    CPU_run();
    return 0;
}   

В этом случае основной процесс был процессом GUI, который не запускается с дескрипторов stdio вообще. Это открывает консоль, затем пихает правильные дескрипторы в stdout и stdin так отладка () функция (который был разработан как stdio интерактивная функция), может взаимодействовать с недавно созданной консолью. Необходимо смочь открыть некоторые каналы и сделать тот же вид вещи перенаправить stderr.

6
ответ дан 13 December 2019 в 22:20
поделиться

Необходимо помнить это, какие вызовы MSVCRT "дескрипторы ОС" не являются дескрипторами Win32, но другим слоем дескрипторов, добавленных только для смущения Вас. MSVCRT пытается эмулировать числа дескриптора Unix где stdin = 0, stdout = 1, stderr = 2 и так далее. Дескрипторы Win32 пронумерованы по-другому, и их значения всегда, оказывается, являются кратными 4. Открытие канала и получение всех дескрипторов, настроенных правильно, потребуют грязного доставления. Используя исходный код MSVCRT и отладчик, вероятно, требование.

3
ответ дан 13 December 2019 в 22:20
поделиться

Вы упоминаете, что не хотите использовать именованный канал для внутреннего пользования; вероятно, стоит полагать, что документация для CreatePipe () состояния, "Неименованные каналы реализованы с помощью именованного канала с уникальным именем. Поэтому можно часто передавать дескриптор неименованному каналу к функции, которая требует дескриптора к именованному каналу". Так, я предлагаю, чтобы Вы просто записали функцию, которая создает подобный канал с корректными настройками для асинхронного чтения. Я склонен использовать GUID в качестве строки (сгенерированное использование CoCreateGUID() и StringFromIID()) дать мне уникальное имя и затем создать сервер и клиентские концы именованного канала с корректными настройками для перекрытого ввода-вывода (больше деталей об этом и кода, здесь: http://www.lenholgate.com/blog/2008/02/process-management-using-jobs-on-windows.html).

После того как у меня есть это, я обеспечиваю электричеством некоторый код, который я должен прочитать, файл с помощью перекрыл ввод-вывод с Портом Завершения ввода-вывода, и, ну, в общем, затем я просто получаю асинхронные уведомления о данных, когда это прибывает... Однако у меня есть изрядный объем хорошо протестированного кода библиотеки там, который заставляет все это произойти...

Вероятно, возможно настроить именованный канал и затем просто сделать перекрытое чтение с событием в Вашем OVERLAPPED структура и проверка событие, чтобы видеть, были ли данные доступны... У меня нет кода доступным, который делает это все же.

1
ответ дан 13 December 2019 в 22:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: