vector als PostMessage parameter...
-
hi,
wie kann ich einer PostMessage einen vector übergeben?? wie kann ich dann den vector in der funktion, welche von der post message aufgerufen wird, verwenden?
vector<string> string_vec; PostMessage(h_HauptdialogDlg, WM_MSG_OPENDlg_IncommingFiletr, reinterpret_cast<WPARAM>(string_vec), 0); error C2440: 'reinterpret_cast' : cannot convert from 'std::vector<_Ty>' to 'WPARAM' LRESULT Client_HauptdialogDlg::On_PostMessage_open_IncommingFile(WPARAM wp, LPARAM lp) { .... reinterpret_cast<...>(wp); AfxMessageBox(string_vec[0].c_str()); }
lg
-
Du kannst wenn den pointer auf den vector übergeben bzw. casten.
Das ist aber SEHR Dirty, aber naja, manchmal ist dirty der schnellste wegDevil
-
wie cast ich einen pointer auf nen vector, wenn der vector am stack liegt? wie kann ich wieder zurückcasten?
bye
-
Hi, wenn du den vector auf den Stack legst, darfst Du auf keinen Fall PostMessage verwenden!
PostMessage geht in die Messagequeue und wird später abgearbeitet.
Du must dann SendMessage verwenden.Du must die Adresse des Vectors übergeben in WPARAM oder LPARAM. Das ist egal.
::SendMessage(hWnd, WM_XXXXXX, (WPARAM)&vector, 0);
Zurückcasten
vector<string>* pVector = reinterpret_cast<vector<string>* > (wParam);
Gruss
EB
-
hi, danke...
SendMessage wird gleich abgearbeitet oder wo ist da das untersch. zu PostMessage?
hmm:
vector<string> *pVector = reinterpret_cast<vector<string>* >(wp); m_ptrIncommingFileDlg->m_EditCtrl_Filename_Control.SetWindowText(pVector[1].c_str()); error C2039: 'c_str' : is not a member of 'std::vector<_Ty>'
cu
-
(*pvec)[0]
-
hi, oh danke..
std::vector<std::string> *pVector = reinterpret_cast<std::vector<std::string>* >(wp); m_ptrIncommingFileDlg->m_EditCtrl_Filename_Control.SetWindowText((*pVector)[3].c_str()); m_ptrIncommingFileDlg->m_EditCtrl_Filesize_Control.SetWindowText((*pVector)[4].c_str()); delete pVector; // <--- laufzeit fehler Debug Assertion Failed... File: dbgheap.c Line: 1132
Expression: _CrtIsValidHeapPointer(pUserData)
ich sollt ja auch wieder delete aufrufen um den speicher frei zu geben!?
cu
-
std::vector<std::string> *pVector = reinterpret_cast<std::vector<std::string>* >(wp); m_ptrIncommingFileDlg->m_EditCtrl_Filename_Control.SetWindowText((*pVector)[3].c_str()); m_ptrIncommingFileDlg->m_EditCtrl_Filesize_Control.SetWindowText((*pVector)[4].c_str()); delete pVector; // <--- diese variable liegt auf stack, nicht auf dem heap -> delete ist schwachsinn
-
aja....
der pointer da zeigt ja auf den vector der am stack liegt....ok gut;-)
Hi, wenn du den vector auf den Stack legst, darfst Du auf keinen Fall PostMessage verwenden!
PostMessage geht in die Messagequeue und wird später abgearbeitet.ok, das heisst ja das das objekt nicht mehr existiert?
cu
-
Die Funktion PostMessage schiebt deine Nachricht einfach nur in die Nachrichtenschleife und kehrt dann zurück.
Im Gegensatz dazu wartet SendMessage nach dem "Abgeben" der Nachricht solange, bis diese Nachricht bearbeitet wurde.Wenn du also Pointer auf lokale Variablen oder Structs (z.b. im Stack) in einer Nachricht versendest, solltest du SendMessage verwenden.
send(HWND wnd) { data DATEN; /* fülle Daten */ PostMessage(wnd, MSG_XXXXX, Daten&); // PostMessage kehrt zurück <-> Aber die Nachricht // muss noch nicht bearbeitet sein. // lokale Variablen werden zerstört. }
Und nicht überall wo ein Pointer steht muss auch ein delete fallen.