Newsgroup: it.comp.programmare.win32
Titolo: [MFC] Risorse libreria statica

Ciao a tutti,
ho una libreria statica con supporto mfc e non riesco in nessun modo a
caricare le risorse (icone e immagini) per poterle usare nel mio programma.
Tutte le funzioni di caricamento, sia quelle delle mfc che quelle dell'api,
mi ritornano sempre NULL. C'è qualche espediente speciale che bisogna
prendere per poterle utilizzare?
grazie, assa.
--
gosclient: 
http://gosclient.altervista.org/
join the mailing list: 
http://groups.yahoo.com/group/gosclient/join
icq: #215876894

 wrote in message
news:burg8p$kh7so$
1...@ID-60516.news.uni-berlin.de

Inserimento della libreria fatta come?
Ambiente di sviluppo?
Codice utilizzato?
Saluti
JJ
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Codice utilizzato?
subito ho provato utilizzando questo:
AfxGetApp()->LoadIcon(IDI_TEST);
ma non andava, quindi ho provato anche una seconda via:
LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_TEST));
entrambi ritornano sempre NULL :(.


 
E' un approccio che non ho mai avuto. Di solito quando si
crea un progetto si usano le risorse dellEXE che stanno in un file .rc
e si ha un solo resource.h (figure e amenicoli vari dovrebbero stare
in una cartella di nome res secondo il default di VC).
Altre risorse si aggiungono al file .rc
Se si vuole invece un ALTRO set di risorse si possono mettere in una dll
e attivarle con righe del tipo:
typedef BOOL (EXPGINST) (HINSTANCE*);
HINSTANCE hInstance, dllhin;
EXPGINST *pFunc;
VERIFY(hInstance = ::LoadLibrary(m_path1));
VERIFY(pFunc = (EXPGINST*) ::GetProcAddress((HMODULE) hInstance,
"ExportGlobInstance"));
pFunc(&dllhin);
hInstResourceClient = AfxGetResourceHandle();
// attiva le risorse della dll
AfxSetResourceHandle(dllhin);
In particolare
AfxSetResourceHandle(hInstResourceClient);
riattiva le risorse dell'EXE
che č buona cosa fare prima di terminare il programma
Evidentemente si possono usare tutte le dll che si vogliono
attivando quella che interessa.
Questo mi sembra l'approccio piů usato ed č anche il mio.
Spero che ti sia di aiuto.


 Spero che ti sia di aiuto.
è una buona idea, mi costringe ad aggiungere una dll al mio progetto ma va
bene lo stesso, penso che userò questo metodo. :)


 
Ciao, non mi e' chiaro perche' esporti quella funzione 
ExportGlobInstance()... come handle non si potrebbe usare gia' quello 
ritornato dalla LoadLibrary()? ...ovviamente il tuo non sara' un errore 
(non credo che aggiungi inutilmente un livello di complessita'), ma non 
riesco a capire il motivo...
Grazie per eventuali chiarimenti!
Bye
Dan

 Dan
Dipende dal tipo di collegamento che si intende fare, se implicito 
o esplicito.
-Implicito.
 Se si include il file LIB della DLL nel progetto dell'exe
che la richiamerà, tutti gli ordinali della LIB vengono collegati
 dal linker all'exe. Al caricamento dell'exe (Run) si caricano anche
tutte le dll.
-Esplicito.
LoadLibrary restituisce un parametro HINSTANCE che passato a 
GetProcAddress quest'ultimo può ottenere dall'ordinale un indirizzo
all'interno della dll.
Così l'exe carica la dll nel momento desiderato.
Quella funzione "ExportGlobInstance" è solo un esempio d'uso.
E' anche un simpatico "richiamino" al fatto che le DLL di Win32
ammettono
sia variabili che funzioni globali per cui è possibile farle 
condividere a più processi (con appositi file di assegnazione 
della memoria) realizzando un interessante sistema di comunicazione
tra processi...ma questa è un'altra storia ;-)
Ave.


 Quella funzione "ExportGlobInstance" è solo un esempio d'uso.
ah...OK :)
Cioe', per accedere all risorse della DLL basta usare come handle quello 
ritornato dalla LoadLibrary(), giusto?
bye
dan
 

 dan
Certo, 
p.es
.
HINSTANCE hInstancePippo = LoadLibrary ("Pippo.dll");
HICON hIcon = LoadIcon (hInstancePippo, MAKEINTRESOURCE(ID_ICON_PIPPO));
Saluti
