2010-04-14 10 views
5

ho cercato di catturare stdout e stderr uscita da una DLL compilata in MSVC++ che il mio Delphi app collega in modo statico, ma finora non hanno avuto successo .Delphi - Cattura stdout e l'output stderr da MSVC linkato staticamente ++ compilato 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; 

Pensavo di essere sulla strada giusta, ma non funziona.

  1. SetStdHandle() è sufficiente?
  2. TFileStream è la cosa giusta da usare qui?
  3. Sto utilizzando TFileStream correttamente per SetStdHandle()?
  4. È possibile che la DLL imposti gli handle stdout/stderr quando viene caricata l'app? In tal caso, dov'è il posto migliore per utilizzare SetStdHandle() o equivalente?

Qualsiasi aiuto sarebbe apprezzato.

+1

fmShareDenyWrite non funziona con fmCreate, è semplicemente inutile. fmCreate o fmShareDenyWrite = fmCreate. – kludg

+0

Interessante Serg, sì, vedo che fmCreate ha un valore di 0xFFFF che renderebbe inutilizzabile qualsiasi flag di modalità di condivisione. Dispari. – Atorian

risposta

7

Se la DLL afferra lo stdout gestisce quando viene caricato, allora si avrà bisogno di caricare dinamicamente la DLL dopo aver modificato lo stdout gestisce nel codice.

+0

Definitivamente un buon punto, anche se anche ora che carico la DLL dinamicamente (dopo aver chiamato SetStdHandle), non ottengo ancora output. – Atorian

+0

dthorpe, la tua raccomandazione ha funzionato (non l'ho visto). Grazie mille. – Atorian

0

Se la tua app è un'app per console, puoi semplicemente eseguire la cosa e acquisire tutto su stdout con reindirizzamento. vale a dire

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