Newsgroup: it.comp.programmare.win32
Titolo: Dialog in dll

carico le dialog con DialogBox()... 
int DialogBox(
    HINSTANCE hInstance,	// handle to application instance
    LPCTSTR lpTemplate,	// identifies dialog box template
    HWND hWndParent,	// handle to owner window
    DLGPROC lpDialogFunc 	// pointer to dialog box procedure  
   );
prima prendo l'handle della dll, poi chiamo findresource, ancora
loadresource,  passo il tutto a lockresource...
  HMODULE Modulo;
  LPVOID lp_void;
  Modulo=GetModuleHandle("LibreriaDinamica.dll");
 
  lp_void=LockResource(LoadResource(Modulo,FindResource 
(Modulo,"DialogBoxInDLL",RT_DIALOG)));
e cosa passo a DialogBox()?

 ha scritto nel messaggio
news:19afd0ff.04050...@posting.google.com...

LockResource / LoadResource / FindResource non servono !!!
lpTemplate e' gia' l'identificativo della risorsa.

Andrea: in realta' ho risolto con questo sistema utilizzando la
funzione DialogBoxIndirect()
ma mi farebbe piacere vedere il suo punto di vista

 ma mi farebbe piacere vedere il suo punto di vista
DialogBoxIndirect serve quando devi pre-caricare in memoria il template per
farci qualche modifica "al volo" o per qualche altro motivo ci devi
"lavorare" sopra prima di visualizzarla.
Altrimenti e' inutile complicare le cose e mettere mano direttamente alle
risorse soltanto per visualizzare una dialog-box !!!
Se la risorsa dialog ce l'hai come numero:
DialogBox (g_hInstance, MAKEINTRESOURCE (IDD_MAIN), NULL, (DLGPROC)
DialogMain_Proc);
Se la risorsa dialog ce l'hai come stringa:
DialogBox (g_hInstance, "DIALOG_MAIN", NULL, (DLGPROC) DialogMain_Proc);
e basta.

Andrea, il sistema che propone funziona nel caso si tratti di un file
eseguibile, ma nel caso si tratti di una libreria dinamica non trova
la risorsa, in quanto come hanno fatto notare a me, la ricerca
nell'eseguibile del programma chiamante la funzione in dll e non nella
dll stessa. la soluzione e' quella che ho applicato: ma penso che
anche lei abbia una soluzione... potrebbe illustrarmela?

 ha scritto nel messaggio
news:19afd0ff.04050...@posting.google.com...

Ok ... allora, il primo parametro della DialogBox() e' un HINSTANCE. Se vuoi
caricare una risorsa (dialog ad esempio) presente nella DLL ma gli passi
l'hInstance dell'applicazione (l'eseguibile) puoi immaginare anche tu che
non funziona ! ;)
Devi quindi ottenere l'hInstance della DLL. Non so se la DLL l'hai scritta
tu e se la chiamata alla DialogBox() la fai all'interno dell'eseguibile o
all'interno della DLL. Comunque puoi ottenere l'hInstance della DLL in
diversi modi:
Se la chiamata a DialogBox() la fai nella applicazione, puoi ottenere
l'hInstance della DLL come ti ha gia' spiegato Fabio, cioe' usando la
GetModuleHandle() oppure se hai caricato la DLL dinamicamente usi
l'hInstance che ti ha ritornato la LoadLibrary().
Se la DLL l'hai scritta tu e la chiamata la fai nella DLL l'hInstance lo
ricavi dall'entry point della DLL (vedi la funzione DllEntryPoint() ).
Se ti puo' essere di aiuto, sul mio sito (vedi firma) trovi un software che
ho chiamato "AB About" che e' una dialog box di "about" personalizzata che
utilizzo per i miei software e che e' implementata in una DLL.
Carica una dialog-box proprio direttamente dalla DLL.
Ciao.
--
Andrea Binello
www.andreabinello.com
 # Software # Codice sorgente
 # Articoli # Tips&Tricks
 # Icone  # Sfondi