Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delphi - Capture stdout and stderr output from statically linked MSVC++ compiled DLL

I have been trying to capture stdout and stderr output from a DLL compiled in MSVC++ that my Delphi app statically links to, but so far have been unsuccessful.

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;

Thought I was on the right track, but it does not work.

  1. Is SetStdHandle() enough?
  2. Is TFileStream the right thing to use here?
  3. Am I using TFileStream properly for SetStdHandle()?
  4. Is it possible that the DLL sets its stdout/stderr handles when the app loads? If so, where is the best place to use SetStdHandle() or equivalent?

Any help would be appreciated.

like image 989
Atorian Avatar asked Apr 14 '10 16:04

Atorian


1 Answers

If the DLL grabs the stdout handles when it is loaded, then you will need to dynamically load the DLL after you have changed the stdout handles in your code.

like image 191
dthorpe Avatar answered Sep 21 '22 00:09

dthorpe