2010-04-14 7 views
5

Ich habe versucht, stdout und Stderr Ausgabe von einer DLL in MSVC kompiliert zu erfassen ++, die meine Delphi App zu statisch verknüpft, aber bisher noch nicht erfolgreich gewesen .Delphi - Erfassung stdout und stderr Ausgabe von statisch gelinkte MSVC++ kompilierte 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; 

Ich dachte, ich war auf dem richtigen Weg, aber es funktioniert nicht.

  1. Ist SetStdHandle() genug?
  2. Ist TFileStream das Richtige für Sie?
  3. Benutzt ich TFileStream richtig für SetStdHandle()?
  4. Ist es möglich, dass die DLL seine stdout/stderr-Griffe setzt, wenn die App lädt? Wenn ja, wo ist der beste Ort, um SetStdHandle() oder gleichwertig zu verwenden?

Jede Hilfe wäre willkommen.

+1

fmShareDenyWrite funktioniert nicht mit fmCreate - es ist einfach nutzlos. fmCreate oder fmShareDenyWrite = fmCreate. – kludg

+0

Interessanter Serg, yeah Ich sehe, dass fmCreate einen Wert von 0xFFFF hat, der alle Share-Modus-Flags nutzlos machen würde. Ungerade. – Atorian

Antwort

7

Wenn die DLL greift die stdout behandelt, wenn es geladen wird, dann werden Sie die DLL dynamisch laden müssen, nachdem Sie die stdout in Ihrem Code Griffe geändert haben.

+0

Definitiv ein guter Punkt, obwohl ich auch jetzt, dass ich die DLL dynamisch lade (nach dem Aufruf von SetStdHandle), bekomme ich immer noch keine Ausgabe. – Atorian

+0

dthorpe, deine Empfehlung hat funktioniert (ich habe es gerade nicht gesehen). Vielen Dank. – Atorian

0

Wenn Ihre App eine Konsolen-App ist, können Sie einfach das Ding ausführen und alles erfassen, um mit Umleitung zu Standout. das heißt

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