2010-04-14 3 views
5
컴파일 정적으로 링크 된 MSVC에서 캡처 표준 출력과 표준 에러 출력 ++

나는 표준 출력 내 델파이 응용 프로그램은 정적으로 연결 MSVC++에서 컴파일 된 DLL에서 표준 오류 출력을 캡처하기 위해 노력했지만, 지금까지 실패되었습니다 .는 델파이 - DLL

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. SetStdHandle()에 TFileStream을 올바르게 사용하고 있습니까?
  4. 앱이로드 될 때 DLL이 stdout/stderr 핸들을 설정할 수 있습니까? 그렇다면 SetStdHandle() 또는 동급 제품을 사용하기에 가장 좋은 곳은 어디입니까?

어떤 도움을 주시면 감사하겠습니다.

+1

fmShareDenyWrite가 fmCreate와 함께 작동하지 않습니다. 단순히 쓸모가 없습니다. fmCreate 또는 fmShareDenyWrite = fmCreate. – kludg

+0

재미있는 Serg, 예, 나는 fmCreate가 공유 모드 플래그를 쓸모 없게 만드는 0xFFFF 값을 가지고 있음을 알았습니다. 이상한. – Atorian

답변

7

로드 할 때 DLL에서 stdout 핸들을 가져 오는 경우 코드에서 stdout 핸들을 변경 한 후에 DLL을 동적으로로드해야합니다.

+0

분명히 좋은 점은, 지금도 (SetStdHandle을 호출 한 후) 동적으로 DLL을로드하더라도, 나는 여전히 출력을 얻지 못한다. – Atorian

+0

dthorpe, 당신의 추천은 효과가있었습니다 (나는 그것을 보지 못했습니다). 고맙습니다. – Atorian

0

앱이 콘솔 앱인 경우, 앱을 실행하고 리다이렉션으로 모든 것을 표준 출력으로 캡처 할 수 있습니다. 즉

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