View Full Version : [C++] Path della dll in uso!
Ciao a tutti, io ho una serie di progetti, ogni progetto ha le proprie
risorse (dialog,menu,string table).
Devo poter caricare le risorse di un progetto piuttosto che di un
altro dinamicamente. Ho una funzione LoadStringFromDLL(HINSTANCE
hInstance, int ID) che riceve l'hinstance e l'id e DOVREBBE usarli per
caricare la risorsa del progetto in esecuzione e la relativa stringa
nella string table.
Se io infatti creo "a mano" l'hinstance settando la dll, per esempio
HINSTANCE hInstance = "nomeprogetto.dll" e poi la passo insieme all'ID
alla funzione, tutto va per il meglio... Ma se provo a rendere tutto
ancora più dinamico, e non dover mettere manualmente il nome della dll
per ogni progetto, non funziona... Ho utilizzato queste due righe di
codice:
char Buffer[255];
GetModuleFileName((HMODULE)AfxGetInstanceHandle(),Buffer,255);
ma il path che mi restituisce è sempre quello del progetto di default,
da cui parte tutto... io vorrei una funzione che mi restituisse il
path del progetto attualmente in uso per poi passarlo alla funzione
LoadStringFromDLL... Mi spiego meglio... Se apro una dialog che non è
nel progetto base (ProgA) ma è nel progetto ProgB, vorrei poter
ricevere il path della dll del ProgB! Così da poterla passare alla
funzione e rendere tutto dinamico..
E' possibile fare tutto ciò? E' un po' che cerco, ma qui in azienda ho
molti siti bloccati compreso google, solo google gruppi è in white
list...
Chi mi aiuta?
Ciao a tutti, io ho una serie di progetti, ogni progetto ha le proprie
risorse (dialog,menu,string table).
Devo poter caricare le risorse di un progetto piuttosto che di un
altro dinamicamente. Ho una funzione LoadStringFromDLL(HINSTANCE
hInstance, int ID) che riceve l'hinstance e l'id e DOVREBBE usarli per
caricare la risorsa del progetto in esecuzione e la relativa stringa
nella string table.
Se io infatti creo "a mano" l'hinstance settando la dll, per esempio
HINSTANCE hInstance = "nomeprogetto.dll" e poi la passo insieme all'ID
alla funzione, tutto va per il meglio... Ma se provo a rendere tutto
ancora più dinamico, e non dover mettere manualmente il nome della dll
per ogni progetto, non funziona... Ho utilizzato queste due righe di
codice:
char Buffer[255];
GetModuleFileName((HMODULE)AfxGetInstanceHandle(),Buffer,255);
ma il path che mi restituisce è sempre quello del progetto di default,
da cui parte tutto... io vorrei una funzione che mi restituisse il
path del progetto attualmente in uso per poi passarlo alla funzione
LoadStringFromDLL... Mi spiego meglio... Se apro una dialog che non è
nel progetto base (ProgA) ma è nel progetto ProgB, vorrei poter
ricevere il path della dll del ProgB! Così da poterla passare alla
funzione e rendere tutto dinamico..Calma .... facciamo chiarezza. Se ho capito bene, tu hai un eseguibile e un certo numero di DLL, giusto? Nella tua applicazione vuoi caricare delle risorse presenti in queste DLL.
Innanzitutto un HINSTANCE non è una stringa, quindi dire
HINSTANCE hInstance = "nomeprogetto.dll"
non ha senso.
Se poi si legge la documentazione di AfxGetInstanceHandle() si scopre che:
Remarks
AfxGetInstanceHandle always returns the HINSTANCE of your executable file (.EXE) unless it is called from within a DLL linked with the USRDLL version of MFC. In this case, it returns an HINSTANCE to the DLL.
La/le DLL sono collegate in modo implicito o esplicito all'eseguibile?? In ogni caso ti serve avere il HINSTANCE del modulo che contiene le risorse, cioè della DLL.
si scusa ho dimenticato un pezzetto.. ecco il codice giusto per l'hInstance:
HINSTANCE hInstance = LoadLibrary("nomeprogetto.dll");
il problema è che non voglio passarlo a mano... mi serve avere, come hai detto giustamente tu, l'HINSTANCE del modulo che contiene le risorse, cioè della DLL... Invece per ora ho solo sempre ottenuto il path dell'eseguibile con questo comando:
GetModuleFileName((HMODULE)AfxGetInstanceHandle(),Buffer,255);
si scusa ho dimenticato un pezzetto.. ecco il codice giusto per l'hInstance:
HINSTANCE hInstance = LoadLibrary("nomeprogetto.dll");Ah infatti!
il problema è che non voglio passarlo a mano...Ok, allora come pensi di specificarlo? O lo metti in un file di configurazione o lo passi negli argomenti del programma o lo determini magari scansionando la directory dove risiede l'exe per cercare le eventuali DLL (a mo' di "plug-in").
mi serve avere, come hai detto giustamente tu, l'HINSTANCE del modulo che contiene le risorse, cioè della DLL... Invece per ora ho solo sempre ottenuto il path dell'eseguibile con questo comando:
GetModuleFileName((HMODULE)AfxGetInstanceHandle(),Buffer,255);Ma hai letto il remark relativo alla AfxGetInstanceHandle???
Ah infatti!
Ok, allora come pensi di specificarlo? O lo metti in un file di configurazione o lo passi negli argomenti del programma o lo determini magari scansionando la directory dove risiede l'exe per cercare le eventuali DLL (a mo' di "plug-in").
Ma hai letto il remark relativo alla AfxGetInstanceHandle???
si ho letto ma non ho capito molto.... non saprei proprio come fare... soprattutto perchè ho visto la mia prima di riga di codice c++ solo 2 settimane fa....... se hai qualche semplice dritta mi fai un grosso favore...
si ho letto ma non ho capito molto.... non saprei proprio come fare... soprattutto perchè ho visto la mia prima di riga di codice c++ solo 2 settimane fa....... se hai qualche semplice dritta mi fai un grosso favore...Però dovresti specificare meglio quali sono le tue intenzioni riguardo questo nome della DLL. Da quanto dici non ti va bene mettere il nome della DLL in modo che sia "cablato" nel programma. Innanzitutto per quale motivo? Perché il nome della DLL potrebbe cambiare? O perché ci possono essere più DLL tra cui scegliere quella da usare?
Spiega meglio!!
Però dovresti specificare meglio quali sono le tue intenzioni riguardo questo nome della DLL. Da quanto dici non ti va bene mettere il nome della DLL in modo che sia "cablato" nel programma. Innanzitutto per quale motivo? Perché il nome della DLL potrebbe cambiare? O perché ci possono essere più DLL tra cui scegliere quella da usare?
Spiega meglio!!
perchè il nome della dll può cambiare a seconda della versione del programma... e anche perchè ci sono più dll...
perchè il nome della dll può cambiare a seconda della versione del programmaOk
e anche perchè ci sono più dll...Ok ma la scelta di una tra le varie dll quando deve essere fatta? A runtime? In base ad altre condizioni? Preconfigurata dall'utente (es. "da oggi uso la dll B piuttosto che la A")?
A questo punto fai prima a configurare il nome della DLL in un file di configurazione (es. .ini) o ad esempio nel registro di Windows.
Ok
Ok ma la scelta di una tra le varie dll quando deve essere fatta? A runtime? In base ad altre condizioni? Preconfigurata dall'utente (es. "da oggi uso la dll B piuttosto che la A")?
A questo punto fai prima a configurare il nome della DLL in un file di configurazione (es. .ini) o ad esempio nel registro di Windows.
io nel codice ho degli "#ifdef nomeversione" e quindi a seconda di con che versione compilo mi esegue un codice piuttosto che un altro..
poi nel programma alcune dialog usano risorse di una dll e altre dialog di altre dll... ed è li che devono appunto essere caricate dinamicamente.. se non cambia la dll ogni dialog richiama sempra la risorsa del progetto dell'eseguibile... e quindi caricano tutte le stesse stringhe e sono poi tutte uguali.. (dove gli ID conicidono).
poi nel programma alcune dialog usano risorse di una dll e altre dialog di altre dll... ed è li che devono appunto essere caricate dinamicamente.. se non cambia la dll ogni dialog richiama sempra la risorsa del progetto dell'eseguibile... e quindi caricano tutte le stesse stringhe e sono poi tutte uguali.. (dove gli ID conicidono).Quindi, tanto per fare un esempio, la dialog A userà sempre la dll X e la dialog B userà sempre la dll Y???
Quindi, tanto per fare un esempio, la dialog A userà sempre la dll X e la dialog B userà sempre la dll Y???
si... poi diciamo che la A userà sempre la X piuttosto che la X7 o Xb (a seconda della versione)... però la dll è sempre la stessa...
si... poi diciamo che la A userà sempre la X piuttosto che la X7 o Xb (a seconda della versione)... però la dll è sempre la stessa...E allora dove sta il problema?? :D
Carica tutte le DLL con LoadLibrary, quindi usa ciascun HINSTANCE ottenuto per caricare quello che vuoi, stringhe con LoadString, ecc...
tomminno
14-05-2007, 08:51
io nel codice ho degli "#ifdef nomeversione" e quindi a seconda di con che versione compilo mi esegue un codice piuttosto che un altro..
poi nel programma alcune dialog usano risorse di una dll e altre dialog di altre dll... ed è li che devono appunto essere caricate dinamicamente.. se non cambia la dll ogni dialog richiama sempra la risorsa del progetto dell'eseguibile... e quindi caricano tutte le stesse stringhe e sono poi tutte uguali.. (dove gli ID conicidono).
non ti va bene qualcosa tipo
#ifdef VER_1_0
hInstance = LoadLibrary("Dll1.0.dll");
#elif VER_1_1
hInstance = LoadLibrary("Dll1.1.dll");
#endif
è quello che faccio ragazzi... ecco il codice del metodo:
HINSTANCE XXX::LoadLb()
{
CString project_name;
#ifdef ver1
project_name = "ver1.dll";
#else
project_name = "ver2.dll";
HINSTANCE hInstance = LoadLibrary(project_name);
return hInstance;
}
il problema è che ho molte versioni... e vogliono un metodo migliore che passi a LoadLibrary il nome della dll che serve senza stare a fare tutti quegli ifdef e mettere manualmente tutte le possibili versioni...
il problema è che ho molte versioni... e vogliono un metodo migliore che passi a LoadLibrary il nome della dll che serve senza stare a fare tutti quegli ifdef e mettere manualmente tutte le possibili versioni...E allora visto che hai una macro che indica la versione del progetto fai una cosa del genere: imposti una macro per es. PRJVER che vale 1, 2 .... ecc... (come la imposti vedi tu, se con #define o tramite switch del compilatore).
Poi componi il nome della DLL:
char szDll[20];
sprintf (szDll, "ver%d.dll", PRJVER);
E allora visto che hai una macro che indica la versione del progetto fai una cosa del genere: imposti una macro per es. PRJVER che vale 1, 2 .... ecc... (come la imposti vedi tu, se con #define o tramite switch del compilatore).
Poi componi il nome della DLL:
char szDll[20];
sprintf (szDll, "ver%d.dll", PRJVER);
però in questo modo devo comunque io indicare i tipi di versione... a me servirebbe un modo di trovare il path della dll che utilizza una determinata dialog... in questo modo potrei estrapolare solo la parte finale ("nome_versione.dll") e passare quello allo script... questa si che sarebbe una soluzione completamente dinamica... ma come ?? :help:
:help: nessuno conosce un modo per aiutarmi? :help:
possibile che non ci sia una soluzione?
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.