Zum Inhalt springen

*.evt mit hilfe von c++ leeren


Empfohlene Beiträge

  • 3 Wochen später...

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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".

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...