LLpresident Geschrieben 6. Juli 2003 Geschrieben 6. Juli 2003 hey. ich will mit hilfe von c++ die eventlogs leeren. wie kann ich das am besten anstellen? muss ich das mit wsh machen oder geht das auch ganz einfach über c++ (benutze den borlandbuilder 50) wie bei .net? thx im vorraus. Zitieren
Klotzkopp Geschrieben 9. Juli 2003 Geschrieben 9. Juli 2003 Du kannst ein EventLog mit der Funktion ClearEventLog löschen. Das dafür benötigte Handle bekommst du von OpenEventLog. Du musst dein Programm mit Advapi32.lib linken, damit du die Funktionen nutzen kannst. P.S.: --> Verschoben nach: C++: Compiler, IDEs, APIs Zitieren
LLpresident Geschrieben 25. Juli 2003 Autor Geschrieben 25. Juli 2003 Will das programm mit hilfe von tevent gestalten. und dann die funktionen openeventlog, notifychangeeventlog und cleareventlog verwenden. bekomm aber den quelltext nich wirklich auf die reihe. zur zeit sieht es so aus: new TEvent(OpenEventLog,true, true, System::OpenEventLog); da bekomme ich aber nur fehlermeldungen. wer kann mir helfen? thx im voraus. Zitieren
Guybrush Threepwood Geschrieben 25. Juli 2003 Geschrieben 25. Juli 2003 Wie lauten den die Fehlermeldungen? Zitieren
LLpresident Geschrieben 28. Juli 2003 Autor Geschrieben 28. Juli 2003 die fehlermeldungen lauten: "typname erwartet" und "in anweisung fehlt ;" Zitieren
LLpresident Geschrieben 7. August 2003 Autor Geschrieben 7. August 2003 ok.hab den letzten fehler gefunden. hab aber ein neues problem. wenn ich das programm compilire bekomm ich diese fehlermeldung: [C++ Fehler] Unit1.cpp(22): E2285 Keine Übereinstimmung für 'TEvent::TEvent(int,bool,bool,void * (__stdcall *)(const char *,const char *))' gefunden wie bekomm ich die weg? Zitieren
Klotzkopp Geschrieben 7. August 2003 Geschrieben 7. August 2003 Original geschrieben von LLpresident wie bekomm ich die weg? Indem du Zeile 22 in Unit1.cpp auskommentierst. Im Ernst, wie sollen wir dir helfen, den Fehler zu beheben, wenn du nicht einmal die fehlerhafte Zeile zeigst? Ich kann nur soviel sagen, das TEvent keinen passenden Konstruktor für die Typen der Parameter, die du angegeben hast (int, bool, bool und void * (__stdcall *)(const char *,const char *)), anbietet. Zitieren
LLpresident Geschrieben 12. August 2003 Autor Geschrieben 12. August 2003 das problem hat sich schon erledigt. wieder mal nicht genug nachgedcht. mein quelltext sieht jetzt wie folgt aus: TEvent *NewTEvent; void __fastcall TForm1::FormCreate(TObject *Sender) { NewTEvent = new TEvent(NULL ,true, true, NULL); NewTEvent = OpenEventLog; } wenn ich das so habe meckert er und gibt mir diese fehlermeldung: [C++ Fehler] Unit1.cpp(23): E2034 Konvertierung von 'void * (__stdcall *)(const char *,const char *)' nach 'TEvent *' nicht möglich sie bezieht sich auf die zweite zeile im formcreate. Zitieren
Klotzkopp Geschrieben 12. August 2003 Geschrieben 12. August 2003 Original geschrieben von LLpresident NewTEvent = OpenEventLog; ... wenn ich das so habe meckert er und gibt mir diese fehlermeldung: [C++ Fehler] Unit1.cpp(23): E2034 Konvertierung von 'void * (__stdcall *)(const char *,const char *)' nach 'TEvent *' nicht möglich.Mir ist nicht ganz klar, was du da machen willst. 1. Du ereugst ein neue Instanz von TEvent, legst die Adresse in deinem Zeiger ab, und überschreibst dann den Zeiger durch eine erneute Zuweisung. Damit ist die Instanz nicht mehr zugänglich -> Speicherleck. 2. OpenEventLog (ohne Klammern) ist ein Funktionszeiger. Ich kann mir nicht vorstellen, welchen Sinn es machen könnte, diesen in einem TEvent* zu speichern. Der Compiler kann das nicht, daher die Fehlermeldungen. Wenn du das trotzdem machen willst (wie gesagt, für mich macht das keinen Sinn), dann musst du den Zeiger mit reinterpret_cast oder einem C-Style-Cast umwandeln. Damit sagst du dem Compiler: "Vertrau mir, ich weiß, was ich mache". Zitieren
LLpresident Geschrieben 13. August 2003 Autor Geschrieben 13. August 2003 hier ein auszug aus der hilfe zu tevent: In einer Singlethread-Anwendung kann TEvent die Koordination von Quelltextabschnitten übernehmen, die auf asynchrone Ereignisse wie z.B. Windows-Botschaften reagieren. und genau dieses will ich. ich will mit tevent feststellen ob etwas neues in eine logdatei geschrieben wurde. Zitieren
Klotzkopp Geschrieben 13. August 2003 Geschrieben 13. August 2003 Original geschrieben von LLpresident hier ein auszug aus der hilfe zu tevent: In einer Singlethread-Anwendung kann TEvent die Koordination von Quelltextabschnitten übernehmen, die auf asynchrone Ereignisse wie z.B. Windows-Botschaften reagieren.Es wird aber keine Windows-Botschaft erzeugt, nur weil irgend jemand OpenEventLog aufruft. Ich kenne TEvent nicht, aber ich würde mich sehr wundern, wenn es in der Lage wäre, einen Hook für eine beliebige API-Funktion zu erstellen. und genau dieses will ich. ich will mit tevent feststellen ob etwas neues in eine logdatei geschrieben wurde. Da wird dir nichts anderes übrig bleiben, als in regelmäßigen Abständen das Eventlog zu öffnen und nachzusehen. Zitieren
LLpresident Geschrieben 13. August 2003 Autor Geschrieben 13. August 2003 also den einen fehler hab ich schon gefunden. hab nich an die anleitung für die mfc gehalten. muss das aber etwas anders machen. als einzelne funktion. sieht dann so aus: OpenEventLog(NULL, "System"); funktioniert noch nicht perfekt aber ich pack das schon. für das abfragen ob das event verändert wurde gibt es die methode NotifyChangeEventLog. Zitieren
Klotzkopp Geschrieben 13. August 2003 Geschrieben 13. August 2003 Original geschrieben von LLpresident OpenEventLog(NULL, "System"); funktioniert noch nicht perfekt aber ich pack das schon.Du musst den Rückgabewert von OpenEventLog speichern, denn das ist das ist das erste Handle, das du bei NotifyChangeEventLog angeben musst. Das andere ist ein Event, das du selbst mit CreateEvent erzeugen musst: HANDLE hLog = OpenEventLog( NULL, "System" ); HANDLE hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); NotifyChangeEventLog( hLog, hEvent ); Beachte, dass der Aufruf von NotifyChangeEventLog blockt, d.h. wenn nicht dein ganzes Programm an dieser Stelle stehenbleiben soll (sprich: es soll noch etwas anderes tun), dann musst du diesen Code in einem neuen Thread ausführen. Zitieren
LLpresident Geschrieben 13. August 2003 Autor Geschrieben 13. August 2003 hm. ok. hab das jetzt nach deinen vorschlägen(diie mir jetzt wo ichs sehe auch logisch erscheinen) geändert. und es klappt. ist echt super. danke. komm jetzt auf alle fälle weiter. ich mus also als erstes nen handle erstellen. dieses dann mit openeventlog belegen. dadurch wissen dann alle anderen methoden welche datei geöfnet ist. richtig? Zitieren
LLpresident Geschrieben 13. August 2003 Autor Geschrieben 13. August 2003 zusatz: wie frage ich jetzt ab ob sich im event was geändert hat? Zitieren
LLpresident Geschrieben 13. August 2003 Autor Geschrieben 13. August 2003 verbesserung zusatz: wie frage ich ab ob sich in der notifychangeeventlog-methode etwas verändert hat? Zitieren
LLpresident Geschrieben 14. August 2003 Autor Geschrieben 14. August 2003 ok. hab das jetzt wie folgt gelöst. ich hab die gesamte notifychangeeventlog-funktion in einen eigenen tread gepackt. so sieht der quelltext jetzt aus: HANDLE hLog = OpenEventLog( NULL, "Application" ); HANDLE hEvent = CreateEvent( NULL, TRUE, TRUE, NULL ); void __fastcall EventTest::Execute() { //---- Hier den Thread-Code plazieren---- NotifyChangeEventLog( hLog, hEvent ); if(NotifyChangeEventLog == NULL) { ShowMessage("neuer eintrag in system"); } } bin mir aber nicht sicher ob es so koreckt ist. um das zu testen löse ich ein softwareproblemm aus. dabei wird mein programm in den hintergrund geschoben. jetzt frag ich mich aber ob das programm überhaupt läuft wenn es nicht ausgewählt ist. auf gut deutsch: muss das programm "aktiviert" sein damit es läuft und geht bei "deaktivierung" in einen pausemodus oder läuft es im hintergrund munter weiter? wenn ja ist mein quelltext falsch. wenn nein: was muss ich tuen damit es auch bei "deaktivierung" funktioniert? Zitieren
Klotzkopp Geschrieben 14. August 2003 Geschrieben 14. August 2003 Original geschrieben von LLpresident HANDLE hEvent = CreateEvent( NULL, TRUE, TRUE, NULL ); Der zweite Parameter muss FALSE sein, weil NotifyChangeEventLog ein manuell zurückzusetzendes Event erwartet. Ein Auto-Reset-Event, wie das, das du erzeugst, funkioniert möglicherweise nicht richtig. NotifyChangeEventLog( hLog, hEvent ); if(NotifyChangeEventLog == NULL) { ShowMessage("neuer eintrag in system"); }Du musst den Rückgabewert von NotifyChangeEventLog verarbeiten. Was du tust, ist NotifyChangeEventLog aufzurufen, den Rückgabewert zu verwerfen, und danach den Funktionszeiger auf NotifyChangeEventLog mit NULL zu vergleichen, was niemals wahr sein wird. Das hier sollte funktionieren:if( NotifyChangeEventLog( hLog, hEvent ) ) { // Neue Events } else { // Fehler }[/CODE] [b]auf gut deutsch: muss das programm "aktiviert" sein damit es läuft und geht bei "deaktivierung" in einen pausemodus oder läuft es im hintergrund munter weiter? wenn ja ist mein quelltext falsch. wenn nein: was muss ich tuen damit es auch bei "deaktivierung" funktioniert?[/b]Ich weiß nicht genau, was du mit "deaktiviert" meinst, aber ein Programm, dessen Fenster im Hintergrund oder minimiert ist, läuft normal weiter. Zitieren
LLpresident Geschrieben 14. August 2003 Autor Geschrieben 14. August 2003 genau das meine ich mit deaktiviert. weils halt nicht mehr das aktive fenster ist. hm. habs jetzt mal nach deinen vorschlägen angeglichen. klapt aber trotzdem nicht. sieht jetzt so aus: void __fastcall EventTest::Execute() { //---- Hier den Thread-Code plazieren---- if(NotifyChangeEventLog(hLog, hEvent)) { ShowMessage("test"); } else { ShowMessage("neuer eintrag in system"); } } jetzt gibt er mir gleich zum anfang wenn das programm gestartet wurde die meldung test. aber wenn ich einen fehler auslöse passiert garnichts. hm. Zitieren
Klotzkopp Geschrieben 14. August 2003 Geschrieben 14. August 2003 Original geschrieben von LLpresident if(NotifyChangeEventLog(hLog, hEvent)) { ShowMessage("test"); } else { ShowMessage("neuer eintrag in system"); }Andersrum. Wenn NotifyChangeEventLog TRUE zurückgibt, gibt es neue Einträge. Der else-Block wird ausgeführt, wenn beim Ausführen von NotifyChangeEventLog ein Fehler auftritt. jetzt gibt er mir gleich zum anfang wenn das programm gestartet wurde die meldung test. aber wenn ich einen fehler auslöse passiert garnichts. hm. Rufst du EventTest::Execute eventuell nur einmal auf? Dann ist das klar. Zitieren
LLpresident Geschrieben 14. August 2003 Autor Geschrieben 14. August 2003 eh ja. aber auf diesen fehler bin ich auch schon gekommen. jetzt sieht mein quelletext so aus: void __fastcall EventTest::Execute() { //---- Hier den Thread-Code plazieren---- do { if(NotifyChangeEventLog(hLog, hEvent)) { Form1->Label1->Caption = "neuer eintrag in system"; Form1->Label2->Caption = "pest"; } else { Form1->Label2->Caption = "test"; Form1->Label1->Caption = "sin"; } } while(Terminated == false); FreeOnTerminate = true; Terminate(); } dabei bekomm ich aber leider immer nur test und sin zu sehen. selbst wenn ich einen fehler in der application.evt auslöse. Zitieren
Klotzkopp Geschrieben 14. August 2003 Geschrieben 14. August 2003 Wie sieht denn der Rückgabewert von GetLastError im else-Block aus? Zitieren
LLpresident Geschrieben 15. August 2003 Autor Geschrieben 15. August 2003 ok. wenn ich getlasterror auf label1 anzeigen lasse dann zeigt er mir die fehlernummer 1450 an. lasse gleichzeitig noch sin anzeigen. ist also immer ein wechsel. dadurch weiss ich immerhin schonmal das er die funktion die ganze zeit durchgeht. Zitieren
Klotzkopp Geschrieben 15. August 2003 Geschrieben 15. August 2003 OK, war alles mein Fehler. NotifyChangeEventLog selbst wartet nicht, sondern richtet nur das Event so ein, dass es ausgelöst wird, wenn ein neuer Eintrag ins Event-Log geschrieben wird. D.h. NotifyChangeEventLog wird nur einmal aufgerufen, und danach mit WaitFor... auf das Event gewartet: HANDLE hLog = OpenEventLog( NULL, "System" ); HANDLE hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); if( NotifyChangeEventLog( hLog, hEvent ) ) { MessageBox( NULL, "NCEL OK", "", MB_OK ); } while( true ) { if( WAIT_OBJECT_0 == WaitForSingleObject( hEvent, INFINITE ) ) { MessageBox( NULL, "Neues Event", "", MB_OK ); } } [/CODE] Zitieren
LLpresident Geschrieben 15. August 2003 Autor Geschrieben 15. August 2003 hey. es klappt. muste blos den quelltext umstellen da der neue teil auserhalb der do-while schleife war. sieht jetzt so aus: void __fastcall EventTest::Execute() { //---- Hier den Thread-Code plazieren---- do { if( NotifyChangeEventLog( hLog, hEvent ) ) { MessageBox( NULL, "NCEL OK", "", MB_OK ); } if( WAIT_OBJECT_0 == WaitForSingleObject( hEvent, INFINITE ) ) { MessageBox( NULL, "Neues Event", "", MB_OK ); } } while(true); } hm. aber ich find es seltsam das notifychangeeventlog nur ein aufruf für ne wartefunktion ist. in dem was ich dazu gefunden habe(msdn) stand nichts von wegen wait. hm. aber egal. es klappt und das ist die hauptsache. thx noch mal. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.