Вывод DLL в stderr не работает при перенаправлении из родительского

0

Я перенаправил stdout и stderr в dll:

dup2(fileno(myLogHandle), fileno(stderr));
dup2(fileno(myLogHandle), fileno(stdout));

который отлично работает при тестировании из dll.

std::cout << "cout\n";
std::cerr << "cerr\n";
fprintf(stdout,"stdout\n");
fprintf(stderr,"stderr\n");
fputs("fputs stdout\n",stdout);
fputs("fputs stderr\n",stderr);
system("echo system stdout");
system("echo system stderr 1>&2");

Дает следующий результат в файле журнала:

cout
cerr
stdout
stderr
fputs stdout
fputs stderr
system stdout
system stderr

Но когда другая DLL (открытая с LoadLibrary) использует stderr, я ничего не получаю в файле журнала.

Пропустить что-то очевидное?

  • 2
    Тривиальное объяснение, обычно правильное, состоит в том, что DLL была построена с использованием или использует собственную CRT. Вы заменили стандартный вывод в вашей копии EXE, но не в DLL. Полагаться на глобальное состояние CRT никогда не будет проблемой, если вы не можете контролировать сборку DLL.
  • 0
    Спасибо! Вы правы, после изменения библиотеки генерации кода и среды выполнения так, что обе DLL используют одинаково (одна использовала статическую версию), это работает.
Теги:
dll
stderr

1 ответ

1

Это совершенно разумно. Вы не перенаправляете стандартные дескрипторы процесса, а только стандартные устройства вывода и ошибки вашей среды выполнения DLL. Другая DLL, по-видимому, использует свой собственный экземпляр среды выполнения.

По сути, вы делаете это неправильно. При создании процесса вы должны перенаправить стандартный вывод и стандартную ошибку на уровне процесса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню