Aktualisieren des Inhalts bei schon vorhandener Programminstanz



  • 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