2010-04-14 14 views
5

que han estado tratando de capturar stdout y stderr salida de un archivo DLL compilado en MSVC++ que mi Delphi aplicación vincula estáticamente, pero hasta ahora no han tenido éxito .Delphi - stdout captura y la salida stderr de MSVC enlazado estáticamente ++ compilado 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; 

Pensé que estaba en el camino correcto, pero no funciona.

  1. ¿Es SetStdHandle() enough?
  2. ¿Es correcto utilizar TFileStream aquí?
  3. ¿Estoy utilizando TFileStream correctamente para SetStdHandle()?
  4. ¿Es posible que la DLL establezca sus identificadores stdout/stderr cuando se carga la aplicación? Si es así, ¿dónde está el mejor lugar para usar SetStdHandle() o equivalente?

Cualquier ayuda sería apreciada.

+1

fmShareDenyWrite no funciona con fmCreate, es simplemente inútil. fmCreate o fmShareDenyWrite = fmCreate. – kludg

+0

Interesante Serg, sí veo que fmCreate tiene un valor de 0xFFFF que haría inútiles las banderas del modo compartir. Impar. – Atorian

Respuesta

7

Si el archivo DLL agarra la salida estándar maneja cuando se carga, a continuación, tendrá que cargar dinámicamente la DLL después de haber cambiado la salida estándar maneja en el código.

+0

Definitivamente es un buen punto, aunque incluso ahora que cargo la DLL dinámicamente (después de llamar a SetStdHandle), sigo sin obtener ningún resultado. – Atorian

+0

dthorpe, tu recomendación funcionó (simplemente no la estaba viendo). Muchas gracias. – Atorian

0

Si su aplicación es una aplicación de consola, puede simplemente ejecutar la cosa y capturar todo para stdout con la redirección. es decir,

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