Aktualisieren des Inhalts bei schon vorhandener Programminstanz



  • Wie hast du es versucht? Mit WM_COPYDATA?



  • Du müsstest dort einen Cast einbauen (und in deiner Nachrichtenbehandlung auch wieder zurückcasten nach LPCTSTR)



  • Ne, ich habe in meiner CMyApp - Klasse eine Membervariable, die den Pfadnamen aus der Kommandozeile nimmt.
    Dies würde ich gerne übergeben.
    Als Nachricht schicke ich meine Selbstdefinierte Nachricht.
    Oder meinst du ich sollte zuerst WM_COPYDATA schicken?
    Habe das jetzt soweit hinbekommen, dass ich stattdessen einen this-Zeiger mitschicke.
    damit wollte ich dann auf die Membervariable zugreifen.
    Jedoch habe ich dann in der CMainFrame das Problem, dass der plötzlich die CMyView Klasse nicht mehr kennt, obwohl ich eine Zeile darüber mir einen Zeiger darauf hole!?!

    CMyView* pView = (CMyView*)(((CFrameWnd*)AfxGetMainWnd())->GetActiveView());
    ASSERT(pView);
    pView->SendMessage(UWM_UPDATEVIEW, NULL, lParam);//hier meckert der
    

    error C2027: use of undefined type 'CMyView'

    EDIT: hatte auch das hier versucht:

    CMyView* pView = (CMyView*)(((CFrameWnd*)AfxGetMainWnd())->GetActiveView());
    ASSERT(pView);
    HWND hView = pView->m_hWnd // dann meckerte er hier
    ::SendMessage(hView, UWM_UPDATEVIEW, NULL, lParam);
    


  • CStoll schrieb:

    Du müsstest dort einen Cast einbauen (und in deiner Nachrichtenbehandlung auch wieder zurückcasten nach LPCTSTR)

    Ich hatte versucht nach LPARAM zu casten, das mag er aber nicht.
    Oder wie meinst du das?



  • Paul_C. schrieb:

    Als Nachricht schicke ich meine Selbstdefinierte Nachricht.
    Oder meinst du ich sollte zuerst WM_COPYDATA schicken?

    Entweder vorher oder gar anstelle.

    So schickt man ab:

    COPYDATASTRUCT cpd;
    		cpd.dwData = nIrgendeineZahl;
    		cpd.cbData = strText.GetLength();
    		cpd.lpData = (void*)strText.GetBuffer(strText.GetLength());
    		pOtherWnd->SendMessage(WM_COPYDATA, (WPARAM)AfxGetApp()->m_pMainWnd->GetSafeHwnd(), (LPARAM)&cpd);
    

    So empfängt man:
    Im Header:

    afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
    

    In der MessageMap:

    ON_WM_COPYDATA()
    

    Die Funktion:

    BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
    {
    	CString strText = (LPCSTR)(pCopyDataStruct->lpData);
    	strText = strText.Left(pCopyDataStruct->cbData);
    	return CFrameWnd::OnCopyData(pWnd, pCopyDataStruct);
    }
    

    Ich habe das nach einer Anleitung auf Codeproject gemacht. 🙂



  • Nur als Anmerkung: Man kann auch seine eigene Nachricht definieren (WM_APP + x) und dort einen Zeiger mitschicken...
    Das WM_COPYDATA ist eigentlich primär für den prozess-Übergreifenden Nachrichtenaustausch geadacht und hier vermutlich überdimensioniert... (da es globalen Speicher allokiert und dieser von einem Prozess in den anderen verschoben wird).
    Wenn die Nachrichten im gleichen Prozess bleiben würde ich immer WM_APP + x verwenden...



  • Jochen, wenn ich ihn richtig verstanden habe, sind es zwei Instanzen seiner Anwendung und damit zwei Prozesse.
    Deswegen ist mir beim Zeiger mitgeben usw. auch unwohl - ich bezweifle, dass das gutgeht. 🙄



  • Zu estartu: danke. werde ich mal anschauen.
    zu Jochen: ja, ich habe auch eine eigene WM_APP+ - Nachricht.
    Habe auch noch einen Denkfehler bemerkt.
    Ich hole mir beim Suchen einer schon vorhandenen Instanz ein Handle des dazugehörigen MainFrames.
    Dieses habe ich dann in meiner CMyApp.
    Von da schicke ich per SendMessage() meine Nachricht an dieses MainFrame.
    Von dort aus wollte ich nun an die Ansicht die Nachricht weiterleiten.
    Ist aber, glaube (hoffe) ich mal nicht nötig. Eigentlich sollte ich ja von dort aus mit Zeigern auf meine View und Doc weiterarbeiten können. Da hakt es noch ein wenig, weil er plötzlich die Klassen (CMyView, CMyDoc) nicht kennen will.
    Mache ich das mit einem Forward-Inlcude dann meckert er (siehe Beschreibung einige Post drüber)?!?



  • estartu schrieb:

    Jochen, wenn ich ihn richtig verstanden habe, sind es zwei Instanzen seiner Anwendung und damit zwei Prozesse.
    Deswegen ist mir beim Zeiger mitgeben usw. auch unwohl - ich bezweifle, dass das gutgeht. 🙄

    Das werden wir sehen. 😃
    🤡



  • estartu schrieb:

    Jochen, wenn ich ihn richtig verstanden habe, sind es zwei Instanzen seiner Anwendung und damit zwei Prozesse.

    Ach so... soweit hab ich nicht jeden Satz des Threads gelesen... sorry... dann geht das natürlich nicht 😞



  • Ok, ich habe die Anwendung nun soweit, dass es keine Fehlermeldungen und Warnungen mehr gibt. Soweit so gut, jedoch funktioniert es nicht. 😞
    Bevor ich auf estartus Lösung komme, poste ich noch ein paar Code-Schnipsel, vielleicht habe ich auch einfach was falsch gemacht.

    CMyApp:

    LRESULT res = SendMessage(hOther, UWM_UPDATEVIEW, NULL, LPARAM(this));
    // Kontrolle, leider gibt SendMessage immer eine NULL wieder
    CString strMyMessage;
    strMyMessage.Format("SendMessage result: %d, hOther = 0x%X", res, hOther);
    AfxMessageBox(strMyMessage.GetBuffer(), MB_OK);
    

    CMainFrame - Nachricht behandeln

    LRESULT CMainFrame::OnUpdateView(WPARAM wParam, LPARAM lParam)
    {
        AfxMessageBox("Bin im MainFrame!!!", MB_OK);
        CMyView* pView	=            (CMyView*)(((CMainFrame*)AfxGetMainWnd())->GetActiveView());
        CMyDoc* pDoc	= (CMyDoc*)(((CMainFrame*)AfxGetMainWnd())->GetActiveDocument()); 
        ASSERT(pView);
        ASSERT(pDoc);
    
        CMyApp* pApp = (CMyApp*)lParam;
        pDoc->m_strFilePath = pApp->m_strAppFilename;
    
        AfxMessageBox(pDoc->m_strFilePath.GetBuffer(),MB_OK);
        pView->ReadFile(); // nutzt pDoc->m_strFilePath
    
        return TRUE;
    }
    

    Er kommt leider nicht in die Nachrichtenbehandlung?!?



  • 🙂 🙂 🙂

    Es funktioniert!!!!
    Danke euch allen, vor allem aber estartu.
    Habe es nun mit WM_COPYDATA gemacht!

    Hat mich auch noch neugierig auf User Messages gemacht, habe so die Vermutung, wie da der Hase läuft. Mal sehen, vielleicht kann ich irgendwann auch noch bessere eigene Nachrichten definieren!

    Toll, und das noch vor der Mittagspause!

    MfG, Paul.

    Das Forum ist spitze!!



  • Keine Ursache. 🙂
    Hey, nun schmeckt das Essen gleich viel besser. 😉



  • Jep, dann mal guten Appetit! 😉


Anmelden zum Antworten