Я перенаправил 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, я ничего не получаю в файле журнала.
Пропустить что-то очевидное?
Это совершенно разумно. Вы не перенаправляете стандартные дескрипторы процесса, а только стандартные устройства вывода и ошибки вашей среды выполнения DLL. Другая DLL, по-видимому, использует свой собственный экземпляр среды выполнения.
По сути, вы делаете это неправильно. При создании процесса вы должны перенаправить стандартный вывод и стандартную ошибку на уровне процесса.