Aktualisieren des Inhalts bei schon vorhandener Programminstanz
-
So, neues Jahr, neues Problem.
Ich habe ein Programm mit eigener Dateierweiterung. Sobald das Programm gestartet ist kann ich keine weiter Instanz von meinem Programm erzeugen. Es öffnet sich also kein Neues. Wenn ich aber auf einer neuen Datei doppelklicke, soll aber mein schon vorhandenes Programm
1. nach vorne geholt werden und
2. den Inhalt der neuen Datei darstellen!Ich weiß dazu nicht, wie ich erfolgreich dem Programm den Fokus geben soll und wie ich ihm dann den Befehl zum Öffnen der neuen Datei übermitteln soll.
Ich vermute mal mit SendMessage(), aber dazu müsste ich wissen wohin?!?MfG,
Paul.
-
So, mit Hilfe des Artikels unter www.codeproject.com/cpp/avoidmultipleinstance.asp habe ich den ersten Punkt schon mal hinbekommen.
Wenn meine Anwendung schon läuft, dann wird es nach vorne geholt!Ich habe nun auch das Handle zu meinem MainFrame. Jedoch weiss ich nicht, wie ich nun einen Zeiger zu meinem View bekomme? Denn dort habe ich eine Funktion zum Darstellen der Datei. Diese will ich natürlich aufrufen, um die neue Datei anzeigen zu lassen.
Kann mir da jemand vielleicht weiterhelfen?
-
-
Danke für die Antwort, hatte das auch schon mal gelesen, aber ich bekomme immer folgende Fehlermeldung:
error C2039: 'GetActiveView' : is not a member of 'CWnd'
Weisst du warum? Ich nutze übrigens .NET 2003.
MfG.
-
Paul_C. schrieb:
Danke für die Antwort, hatte das auch schon mal gelesen, aber ich bekomme immer folgende Fehlermeldung:
error C2039: 'GetActiveView' : is not a member of 'CWnd'
Weisst du warum? Ich nutze übrigens .NET 2003.
Ja, du musst noch nach CFrameWnd casten.
-
Also, wenn ich das so schreibe, dann bleibt die Fehlermeldung:
CMyView* pView = dynamic_cast<CMyView*>((CFrameWnd*)AfxGetMainWnd()->GetActiveView());
-
Da fehlt imho eine Klammer:
CMyView* pView = dynamic_cast<CMyView*>(((CFrameWnd*)AfxGetMainWnd())->GetActiveView());
-
Hattest Recht!
Aber nun erhalte ich eine Warnung:warning C4541: 'dynamic_cast' used on polymorphic type 'CView' with /GR-; unpredictable behavior may result
Kann ich die auch noch irgendwie umgehen oder kann ich die schlicht und einfach ignorieren?
-
Du musst in den Projekteigenschaften RTTI einschalten.
-
Ok, vielen Dank!
Nun habe ich ein Problem alles zu verbinden, so das es Sinn macht:Also, ich bekomme nun, wenn ich versuche, meine Anwendung ein zweites Mal zu öffnen, das Handle zum ersten geöffneten Programm:
hWnd.
Dieses Handle habe ich im CMainFrame der zweiten Anwendung, die sich aber danach irgendwann schließt.
Dort will ich dann aber einen Zeiger auf die Ansicht des ersten geöffneten Programms erstellen.
Dachte, ich erstelle ein neues CMainFrame-Objekt mit Hilfe der FromHandle()-Methode. Doch wie mache ich weiter? Oder bin ich auf dem falschen Weg?
-
Eventuell könnte ich auch eine Nachricht definieren, welche ich dann per SendMessage an das hWnd schicke, in dessen Behandlungsroutine einfach von dort die Ansicht aktualisiert wird?!
Was meinst du?EDIT: Mist, habe mich vertan, das Handle habe ich nicht im CMainFrame, sondern in der CMyApp.
-
Das mit der eigenen Nachricht wäre eine Idee.
Oder du schickst WM_CLOSE - und lässt die neue Instanz laufen als wäre nichts gewesen.
-
Das ist natürlich auch "tricky". Ich probiere es mal mit der Nachricht.
Du hattest auch mal irgendwo geschrieben, wie man eine Klasse "forward-inlcuden" (richtig?) kann.
Denn wenn ich den Cast mache, dann erzeugt er ja einen Zeiger vom Typ CMyView.
In der CMainFrame ist ja MyView.h nicht included (wenn ich es mache, dann gibt es wieder eine Menge Fehlermeldungen).
Bevor ich mich um die Fehler kümmern muss, wollte ich mal probieren, ob es nicht mit einem Forward-Inlcude funktioniert. Wie ging das nochmal?
Habe zuerst einfach mal:extern CMyView;
geschrieben, dann kam aber Folgendes:
error C2065: 'pView' : undeclared identifier
error C2061: syntax error : identifier 'CMyView'
-
class CMyView;
Oder Suche mit *Ringinclude* füttern.
-
Die Suche scheint mich manchmal aus mir nicht bekannten Gründen nicht zu mögen.
Danke nochmals!
-
So, doch noch ein Problem:
error C2680: 'CMyView *' : invalid target type for dynamic_cast
Habe nun in der MainFrame den Forward-Include gemacht:
class CMyView
EDIT: Ok, ohne dynamic_cast funktioniert es. Was ist eigentlich der Sinn eines dynamic_casts?
-
dynamic_cast gibt dir NULL, wenn es nicht geklappt hat.
Wenn du aus CWnd ein CEdit machen willst - das aber ein CButton ist, dann bekämst du NULL und wüsstest, dass du mit dem Zeiger nicht arbeiten darfst.
-
Ah!! Man lernt nie aus! Heute habe ich Einiges dazu gelernt.
Danke nochmals. Wenn ich es hinbekomme melde ich mich nochmal.
Wird aber wahrscheinlich morgen erst was.
-
So ein Problem taucht noch auf:
Ich möchte mit SendMessage() meiner View meine Nachricht übermitteln. Als
LPARAM - Argument würde ich gerne den Dateipfad + Dateinamen übergeben.
Da meckert er:h:\C++ error C2597: illegal reference to non-static member 'CMyApp::m_strFile'
Dann habe ich versucht, diese Variable als static zu deklarieren. Dann kommt Folgendes:
error C2664: 'SendMessageA' : cannot convert parameter 4 from 'CString' to 'LPARAM'
Warum geht das nicht?
EDIT: Ich habe es auch mit Zeigern versucht. Das will er auch nicht.
Ich meine, einen String in eine long-Variable zu packen, geht nicht, ist auch klar, aber wie mache ich das denn dann?
-
Wie hast du es versucht? Mit WM_COPYDATA?