HANDLE geht verloren
-
Ich habe ein dickes Problem:
Ich öffne den COM-Port und bekomme dafür ja ein HANDLE zurück...so weit, so gut. Ich kann auch alles machen, bis zu dem Zeitpunkt, wenn ich einen modalen Dialog aufmache und versuche, mit dem Handle zu arbeiten.
Irgendwie läuft der COM-Port im Hintergrund, denn die Nachrichten kann ich abfangen, aber sobald ich eine Aktion auf dem Port ausführen möchte, sagt er mir, dass der HANDLE ungültig ist. (ist 0) *heul*Der Port wird in meinem MainView gestartet (über eine weitere Klasse) und ich fange im MainView die Nachrichten ab...dann öffne ich den modalen Dialog (das Abfangen der Nachrichten im "Hintergrund" funktioniert noch) und greife auf eine Funktion des MainView zu, welche auf den COM-Port schreibt...und da kommt die Fehlermeldung! (aus der COM-Port-Klasse, da dort mit assert(HANDLE !=0) geprüft wird)
Was mache ich falsch?
-
Codeausschnitt wie du den Dialog öffnest und auf den Handle zugreifst. Mit Debug kannst du aber selbst festellen wo das Problem liegt.
IMHO greifst du aber nicht auf die aktive Instanz der MainView zu. In der View hat aber ein COMPORT-Code eh nichts verloren. Dazu gibt es die DOC.
Das Prinzip der DOC/VIEW = VIEW ist für Anzeige der Daten aus der DOC zuständig und nur für die Anzeige.
-
In meiner Hauptklasse:
Deklarieren der Variable port in der .h:CSerialPorte m_port;
Die Aktivierung meines COM-Ports:
m_port.InitPort(this, m_Einstellungen.com+1, 57600); m_port.StartMonitoring(); //Hiermit werden Meldungen abgefangen(RX_CHAR...) //klappt auch noch, wenn modaler Dialog offen ist
Der Aufruf meines Dialoges:
CProtMessen Dlg1; CKabSOFTDoc* pDoc1 = GetDocument(); ASSERT_VALID(pDoc1); Dlg1.DoModal();
In meiner Klasse des modeln Dialogs:
BYTE sender[9]; sprintf((char*)sender,"%c%c%c%c%c%c%c%c%c%c",0xFA,0xFA,0xFA,0x02,0x03,0xFA,0xFA,0xFA,0xFB); CKabSOFTView* baba=(CKabSOFTView*) GetParentOwner(); baba->KabtecSenden(sender);
Hier die Funktion, die aufgerufen wird:
void CKabSOFTView::KabtecSenden(CString ch) { int i; char send[100]; // ch="WER"; memset(&send, 0, sizeof(send)); for (i=0;i<strlen(ch)-1;i++){ send[i]=ch[i];} m_port.WriteToPort(send); }
Also wie gesagt, wenn ich in meinem Hauptfenster die Funktionen aufrufe, klappt alles...nur vom Dialog aus hängts.
-
Bist du sicher, dass dir GetParentOwner das richtige Fenster gibt? Was sagt denn der Debugger zu baba? Der sollte den dynamischen Typ anzeigen können.
-
Das klappt definitiv, er ruft ja die Funktion
m_port.WriteToPort(send);
auf...(hab das mit einer Messagebox getestet)
...in der Funktion passiert dann der Fehler, dass der Handle 0 ist.
-
Großes Danke an alle!!!
Ich habe es!
GetParentOwner() hat mir tatsächlich nicht das richtige Handle zurückgegeben!Ich habe mir jetzt vor dem Aufruf des modalen Dialogs das Handle des MainViews gemerkt und übergebe den Wert in den modalen Dialog. Dort deklariere ich das Handle als Pointer auf die Klasse des MainView und kann nun alles aufrufen, sogar Funktionen die in einer weiteren in der MainView deklarierten Klasse auftreten.
Hier mal der Ansatz, falls mal wieder jemand darüber stolpert:
in der Hauptklasse, von der aus die serielle Schnittstelle gestartet wird://Klasse CTestView HANDLE hier=this; Dlg1.m_handle=hier; Dlg1.DoModal();
im modalen Dialog (oben Dlg1), der etwas mit der seriellen Schnittstelle der Hauptklasse machen möchte
CTestView* baba=(CTestView*)m_handle; baba->Senden(sender,0); //Das ist die Funktion in der Klasse CTestView