CString -> LPARAM



  • Hi gibts irgendwie ne Möglichkeit ein CString in ein LPARAM umzuwandeln ?



  • reinterpret_cast<LPARAM>((LPCTSTR)strString)
    


  • Ahh vielen Dank 🙂



  • Du kannst ihn einfach casten, mußt ihn am anderen Ende aber wieder zurückverwandeln (über den Umweg LPTCSTR). Allerdings solltest du den Zeiger nicht über PostMessage() schicken (und auch nicht an Fenster außerhalb deines eigenen Prozesses).



  • Hmmm ich verschick das über SendMessage, funtzt allerdings nicht mist..



  • An wen versendest du das? (wenn das an ein anderes Programm geht, hat du ein Problem mit der Gültigkeit des Zeigers - die Adresse gehört zu deinem Prozess, also wird ein anderes Programm nichts damit anfangen können)



  • Ich versende das an eine Callback Funktion, gibts den sonst irgendwie ne Möglichkeit das dorthin zu schicken ?

    int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
    {
    
    	//CFTP2Dlg *pThis = (CFTP2Dlg*) lpData;
    
    	if(uMsg == BFFM_INITIALIZED)
    
    	{
    
    		//SendMessage(hwnd, BFFM_SETSELECTION,TRUE,reinterpret_cast<LPARAM>((LPCTSTR)pThis->Load));
    			SendMessage(hwnd, BFFM_SETSELECTION,TRUE,lpData);		
    	}
    	return 0;
    
    }
    
    void CFTP2Dlg::OnBnClickedButton6()
    {
    ...
    bi.lpfn = BrowseCallbackProc;
    ...
    }
    

    Ich hab keine Ahnung warum das überhaupt funktioniert da oben ( also das die Callback aufgerufen wird obwohl es keine Memberfunktion ist ) . Naja und da wollte ich halt die globale Variable CString Load übergeben ( als PARAM )



  • toxor schrieb:

    Ich versende das an eine Callback Funktion, gibts den sonst irgendwie ne Möglichkeit das dorthin zu schicken ?

    Und hast du diese Callback-Funktion innerhalb deines Programms eingerichtet - oder ist das ein eigenständiges Programm? (ich glaube, wir reden aneinander vorbei)

    Ich hab keine Ahnung warum das überhaupt funktioniert da oben ( also das die Callback aufgerufen wird obwohl es keine Memberfunktion ist ) . Naja und da wollte ich halt die globale Variable CString Load übergeben ( als PARAM )

    Warum sollte es nicht funktionieren? Die WinAPI wurde noch auf Grundlage von C geschrieben - und damals hat man seine Windows-Programme nur auf diese Weise geschrieben (und ohne überhaupt etwas von Klassen (im C++ Sinn) oder Memberfunktionen gehört zu haben). Die MFC ist letzlich eine Wrapper-Bibliothek, die nahezu alle WinAPI-Aufrufe hinter einer Klassenhierarchie versteckt.



  • Ah ok ,sry , ich versende das innerhalb eines Programms ( also in keinem Eigenständigen Programm), sollte doch eigentlich schon gehen oder ?



  • wie holst du dir dann den string? du musst dann im messagehandler den string zurückcasten:

    CString text = reinterpret_cast<LPCTSTR> (lParam);
    


  • hmmm ich versteh nicht ganz 😕



  • na du sendest die message ja an ein hwnd... und dort muss doch irgendwo ein handler sein, der die message verarbeitet? dort, wo du mit dem string was machen willst...



  • Eigentlich will ich den String in die Callback schicken damit dort was mit dem String gemacht wird.

    Ich mach das hier nach diesem Bsp :
    http://blog.voidnish.com/?p=113

    aber ich möchte halt anstatt das ein im Code vorgeschriebenes Verzeichnis, ein CString übergeben wo das Verzeichnis drin steht.



  • ach, jetzt versteh ich... sorry... ne dann brauchst du das nicht zurückcasten. du selbst machst also mit dem string nixmehr, wenn ich das jetz richtig verstehe..



  • jop genau, ich möchte halt das Startverzeichnis nicht statisch vergeben , sondern zur Laufzeit ändern. Und da will die Callback funktion ein LPARAM, aber irgendwie lässt sich das so nicht realisieren fürchte ich 😞



  • Probiere mal folgendes:

    int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
    {
    	if(uMsg == BFFM_INITIALIZED)
    	{
    
    		SendMessage(hwnd, BFFM_SETSELECTION,TRUE,lpData);		
    	}
    	return 0;
    }
    
    void CFTP2Dlg::OnBnClickedButton6()
    {
    ...
    CString strInitialDir(_T("C:\\Windows"));
    
    bi.lpfn = BrowseCallbackProc;
    bi.lParam = (LPARAM) (LPCTSTR) strInitialDir;
    ...
    }
    


  • JAAAA MAN Thats it 😉 Danke


Anmelden zum Antworten