PDA

Visualizza la versione completa : [C++] Variabile globale in una DLL


ombra
16-02-2010, 18:36
Ciao a tutti,
Sto realizzando una DLL col Visual C++, in che modo bisogna dichiarare una variabile globale? (cio visibile da tutte le funzioni della DLL) ?

Scusate la domanda idiota, ma purtroppo non ho mai usato il C++, mi serve per forza di cose questa semplicissima DLL, con 2-3 funzioni.

Grazie mille

MItaly
16-02-2010, 19:19
Devi definirla in cima, al di fuori del corpo delle funzioni. Se poi vuoi che sia visibile da qualunque .cpp, dovrai anche dichiararla come extern in un header che andrai ad includere in tutti i .cpp.
Occhio comunque che, a seconda di come viene usata la dll, delle variabili globali potrebbero non essere una buona idea.
Per inciso, scrivere dll non mi pare il migliore approccio al C++, o quantomeno, non il pi facile...

ombra
16-02-2010, 19:32
perch non una buona idea?

Praticamente un mio software chiama una funziona della DLL, se il controllo passa setto la variabile a TRUE, senza rifare ogni volta lo stesso controllo.

sbagliato?

Calcola, come se fosse una login, faccio il controllo e setto l''utente come loggato, senza controllare di volt ain volta i dati di accesso.
Fammi sapere che un aspetto molto importante, praticamente mi interesserebbe molto sapere per quale motivo l'approccio alle variabili globali secondo te sbagliato.


Grazie

MItaly
16-02-2010, 23:47
Ho detto che in alcuni casi sbagliato; nello specifico, quando non sai se il codice del chiamante multi-threaded o meno, e soprattutto quando la variabile globale (che di fatto viene inizializzata dalla "vera" DllMain) un oggetto che nel suo costruttore/distruttore fa operazioni che sarebbero vietate nel DllMain. Dai un'occhiata qui (http://stackoverflow.com/questions/75701/what-happens-to-global-variables-declared-in-a-dll) per ulteriori dettagli.

ombra
17-02-2010, 00:27
ok, ultima domanda.
Bisogna in qualche modo liberare la memoria(per questa variabile globale) al termine del lavoro svolto dalla DLL?

MItaly
17-02-2010, 00:35
No, devi liberare solo la memoria che allochi dinamicamente (con new/malloc/...).

ombra
17-02-2010, 00:36
comunque a me basta:



bool attivo;


e stop.

Praticamente quando l'utente loggato la imposto su true.
Nessun altra operazione

MItaly
17-02-2010, 00:45
Ok, allora non dovrebbe porre problemi.

MacApp
17-02-2010, 03:44
Originariamente inviato da ombra
comunque a me basta:



bool attivo;


e stop.

Praticamente quando l'utente loggato la imposto su true.
Nessun altra operazione

meglio sarebbe:


bool globalMyDllAttivo;

meglio ancora:


static bool globalMyDllAttivo = false;

bool IsMyDllAttiva (void){
return globalMyDllAttivo;
}

void SetMyDllAttivo (const bool theAttivo){
globalMyDllAttivo = theAttivo;
}


Insomma rendi opaca la variabile globale, ed esporti le funzioni per maneggiarla.
;-)

ombra
17-02-2010, 17:57
ottimo!!!
grazie a tutti

Loading