MESSAGE_HANDLER Problem
-
Hallo,
ich habe gerade eine Funktion geschrieben, mit welcher ich einen Registry-Key erstellen kann. Aus einer Hilfe entnahm ich, dass ich in meine Klasse noch eine Message_Map hinzufügen muss, was ich auch getan habe:
protected: BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_ENDSESSION, TWMEndSession, WMEndSession) END_MESSAGE_MAP(TForm)
Wenn ich mein Programm jetzt starten will kommt folgender Fehler:
Aufruf einer undefinierten Funktion 'WMEndSession'
Hier die Funktion, in der ich den RegKey setze:
void __fastcall TFormMain::WMEndSession(TWMEndSession &Message) { // local TRegistry *Reg = new TRegistry; try { Reg->RootKey = HKEY_LOCAL_MACHINE; if (Reg->OpenKey("\\HARDWARE\\SOFTWARE\\myAPPtest", true)) { Reg->WriteString("myPath", "test"); Reg->CloseKey(); } } __finally { delete Reg; TFormMain::WMEndSession(Message); }
Die richtige Unit habe ich auch inkludiert:
#include <registry.hpp>
PS: Wozu sind diese "Meldungshandlerfunktionen" gut und was genau für eine Meldung wird dadurch meiner Funktion übergeben? Bin aus der Hilfe nicht wirklich schlau geworden. Habe nämlich keinen Schimmer, wofür die MESSAGE_MAP sein soll.
Ich hoffe ihr könnt mir helfen.
Danke.
Gruß
nki
-
Hab das Problem gelöst.
Der Funktionsname musste mit dem 3. Parameter in der MESSAGE_MAP übereinstimmen.
Aber jetzt hab ich noch ein kleines Problemchen, beim Aufrufen der Funktion.
Ich kann mit dem Typ TWMEndSession nichts anfangen, welchen ich der Funktion übergeben muss:
void __fastcall TFormMain::WMEndSession(TWMEndSession &Message)
was muss ich da genau tun, um diese Funktion richtig aufzurufen?
[EDIT]
So wie das aussieht, ist TWMEndSession ein Struct. Aber wofür die einzelnen, enthaltenen Variablen gut sind, weiß ich leider nicht. Im Internet hab ich dazu auch nicht wirklich viel gefunden.
Habe aus lauter Verzweiflung einen kleinen Test gemacht, welcher aber eine Access Violation erzeugt:
TWMEndSession test; test.Msg = 0; test.EndSession = 0; test.Unused = 0; test.Result = 0; WMEndSession(test);
[/EDIT]
Danke
-
Hallo
Wenn du nichtmal weißt wozu du diese Windowsnachricht brauchst, warum willst du die dann überhaupt einsetzen?
Wenn du nur mit dem Schließen des Forms einen Registry-Wert speichern willst, dann benutzt einfach den passenden OnClose-Event oder den Destruktor (nicht OnDestroy) des Forms.
bis bald
akari
-
Hi akari,
dieselbe Frage hab ich mir auch schon gestellt. Hab das hier irgendwo im Forum so gesehen und gedacht, dass ich diese Messages unbedingt dafür benötige. Ist aber scheinbar nicht so
Hab mein Problem übrigens grad gelöst und wollte es gerade hier schreiben.
Der Fehler lieg hier:
__finally { delete Reg; TFormMain::SetRegistryKeys(Message); }
Die Funktion wurde ständig wieder aufgerufen und dadurch kam's dann irgendwann zum großen Knall (Access Violation). Hätte mir eigentlich schon früher auffallen sollen.
Jetzt funktioniert alles und mein Key ist in der Registry
Danke
Gruß
nki