Via PostMessage String versenden und mit ON_REGISTERED_MESSAGE wieder entschlüsseln


  • Mod

    Jonson86 schrieb:

    char* cBuffer = new char[256];
            cBuffer = (char *)m_sFolder.GetBuffer(m_sFolder.GetLength());
            m_sFolder.ReleaseBuffer();
    

    wo liegt jetzt mein Fehler?

    Vielen Dank für die Hilfe.

    Du allokierst hier zwar Speicher, aber kopierst die Daten nicht. Du kopierst nur den Zeiger.
    Warum legst Du nciht einen neuen CString an.

    Ich hoffe Du gibst den Aray auch wieder frei!



  • Ich schlage mal WM_COPYDATA als Alternative vor.


  • Mod

    hustbaer schrieb:

    Ich schlage mal WM_COPYDATA als Alternative vor.

    WM_COPYDATA muss mit SendMessage versendet werden!



  • Uff. Sorry, das war mir nicht bekannt!
    Gibt's dann mit PostMessage echt keine andere Möglichkeit, als die Daten selbst wieder freizugeben?



  • Bei PostMessage() läuft das Programm anschließend weiter, ohne daß du feststellen kannst, wann die Nachricht tatsächlich ankommt. Das heißt, die übergebenen Daten müssen so lange überleben, bis sie verarbeitet werden können. Wenn SendMessage() dir andere Probleme bereitet, gibt es auch noch SendMessageTimout() oder SendMessageCallback().



  • CStoll schrieb:

    Bei PostMessage() läuft das Programm anschließend weiter, ohne daß du feststellen kannst, wann die Nachricht tatsächlich ankommt. Das heißt, die übergebenen Daten müssen so lange überleben, bis sie verarbeitet werden können. Wenn SendMessage() dir andere Probleme bereitet, gibt es auch noch SendMessageTimout() oder SendMessageCallback().

    CString *pdata = new CString( data );
    if( !the_cwnd->PostMessage( UWM_DATA, (WPARAM) pdata, (LPARAM) 0 ) )
    	delete pdata;
    

    Damit weisst du zwar immer noch nicht ob und wann die Nachricht tatsächlich angekommen ist, aber du hast zumindest kein leak.



  • Also nach einigem Lesen und probieren, bin ich hierbei gelandet, aber kriege es immer noch nicht hin. Ich bin noch nicht so lange mit C++ am Start und komme nicht mehr weiter und finde auch keine Lösung mehr.

    Beim Starten der Anwendung:

    cmdInfo.m_nShellCommand = CCommandLineInfo::FileNew;
        m_sFolderForStartup = new CString;   // Cstring * m_sF...
        (*m_sFolderForStartup) = cmdInfo.m_strFileName;
    
    // ...
    
    HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "BlaBla");
    
        // Mutex-Handle ist 0, Mutex erzeugen:
        if (!hMutex)
            hMutex = CreateMutex(0, 0, "BlaBla");
        else
        {
            // Dies ist die 2. Programminstanz. Die erste Instanz in 
            // Vordergrund bringen:
            HWND hWnd = FindWindow(0, "BlaBla-Window");
            SetForegroundWindow(hWnd);
    
            PostMessage(hWnd,nMsgID,(WPARAM)m_sFolderForStartup,NULL);
    
            return 0;
        }
    
    // ...
    

    in der MainForm:

    LRESULT CMainFrame::OnBlaBlaMessage(WPARAM wParam, LPARAM lParam)
    {    
        CString * pString = (CString *)wParam;
    
        MessageBox((*pString), "TEST", MB_OK);
    
        return NULL;
    }
    

    Kann mir jemand die Lösung meines Problems nennen?

    Vielen Dank und Grüße,
    Jonson


  • Mod

    Du kannst keine Zeiger über Projekt-Grenzen hinweg per PostMesage senden, das geht nur innerhalb eines Prozesses.

    Verwende SendMessage und WM_COPYDATA.
    Das hatte die hustbaer bereits geraten!



  • Mit ATOM könnte man es theoretisch auch lösen 😉
    http://msdn.microsoft.com/en-us/library/ms649056



  • Vermutlich eher
    http://msdn.microsoft.com/en-us/library/ms649060
    (AddAtom <-> GlobalAddAtom)

    Und 16 Bit IDs.... uiuiui. 🤡
    (OK, ATOMs werden so wenig verwendet, da wird das 16 Bit Limit wohl kein echtes Problem sein)


Anmelden zum Antworten