Delphi - захватывает вывод stdout и stderr из статически скомпилированной библиотеки MSVC ++ - PullRequest
5 голосов
/ 14 апреля 2010

Я пытался перехватить вывод stdout и stderr из библиотеки DLL, скомпилированной в MSVC ++, на которую статически ссылается мое приложение Delphi, но до сих пор не удалось.

procedure Test;
var
  fs: TFileStream;

begin
  fs := TFileStream.Create('C:\temp\output.log', fmCreate or fmShareDenyWrite);
  SetStdHandle(STD_OUTPUT_HANDLE, fs.Handle);
  SetStdHandle(STD_ERROR_HANDLE, fs.Handle);

  dllFunc(0); // Writes to stdout in MSVC++ console app, but not here
  // fs.Length is always zero

  fs.Free;
end;

Думал, что я на правильном пути, но это не работает.

  1. Достаточно ли SetStdHandle ()?
  2. TFileStream - это то, что нужно использовать здесь?
  3. Правильно ли я использую TFileStream для SetStdHandle ()?
  4. Возможно ли, что DLL устанавливает свои дескрипторы stdout / stderr при загрузке приложения? Если да, то где лучше всего использовать SetStdHandle () или эквивалентный?

Буду признателен за любую помощь.

Ответы [ 2 ]

7 голосов
/ 14 апреля 2010

Если DLL захватывает дескрипторы stdout при загрузке, вам нужно будет динамически загружать DLL после изменения дескрипторов stdout в вашем коде.

0 голосов
/ 14 апреля 2010

Если ваше приложение является консольным приложением, вы можете просто запустить его и записать все в стандартный поток с перенаправлением. т.е.

C:\MyAppWhichCallsDll.exe > c:\temp\output.log
...