Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C++] Problemi con DialogBoxParam

    Buonasera,
    ho un problema probabilmente banale, ma non ne vengo a capo.

    In sostanza ho un puntatore ad una classe che vorrei passare come lParam con il metodo DialogBoxParam, il codice è il seguente:

    codice:
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	int wmId, wmEvent;
    	PAINTSTRUCT ps;
    	HDC hdc;
    
    	Ricerca* r = reinterpret_cast<Ricerca*>(GetWindowLongPtr(hWnd,GWLP_USERDATA));
    
    	switch (message)
    	{
    ............
    
    	case IDM_TROVA:
    	DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_TROVA), hWnd, Trova, (LPARAM) r);
    	break;
    ..............
    Ora, al momento di di recuperare il puntatore dentro la DialogProcedure Trova procedo in questo modo

    codice:
    INT_PTR CALLBACK Trova(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	UNREFERENCED_PARAMETER(lParam);
    	int wmId, wmEvent;
    
    	Ricerca* r = reinterpret_cast<Ricerca*>lParam;
    Ora se faccio r-> in effetti riesco ad accedere ad ogni variabile e metodo della classe, ma non appena scrivo qualcosa questo genera errore. Dal debug ho dedotto che quello che r dentro la DialogProcedure punta cose a caso in memoria (per per esempio mi dice r->i=... nonostante i sia un valore correttamente inizializzato e più volte acceduto prima della chiamata alla DialogBox).

    Con ogni probabilità sono io che non ho capito che si usa la DialogBoxParam, ma per quello che ho trovato su MSDN sono rimasto al punto di partenza...

    Da notare che se non uso DialogBoxParam ma accedo in modo brutale al puntatore r
    codice:
    Ricerca* r = reinterpret_cast<Ricerca*>(GetWindowLongPtr(GetParent(hDlg),GWLP_USERDATA));
    Tutto funziona correttamente, ma questa soluzione non è quello che cerco.

    Grazie a chiunque saprà darmi una mano.

  2. #2
    Il parametro passato a DialogBoxParam viene fornito via lParam solo nel messaggio WM_INITDIALOG; come farebbero altrimenti a funzionare tutti gli altri messaggi che forniscono altre informazioni via lParam? Devi quindi recuperarlo quando il dialog riceve WM_INITDIALOG, memorizzarlo da qualche altra parte (ad esempio, nello spazio userdata associato alla finestra) per poterlo utilizzare anche in seguito.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3

    Grazie

    Si, in effetti è sorprendentemente logico, grazie di tutto.... posto per completezza il codice corretto qualora qualcuno abbia il medesimo problema

    codice:
    	case WM_INITDIALOG:
    		SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)lParam);
    		return (INT_PTR)TRUE;
    
    ..........
    
    		case IDOK:{
    			Ricerca* r = reinterpret_cast<Ricerca*>(GetWindowLongPtr(hDlg,DWLP_USER));
    Grazie Ancora!

  4. #4
    Prego, alla prossima!
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.