PDA

Visualizza la versione completa : varibili globali e DLL in C++


ik1wvq
03-03-2009, 22:56
Ciao a tutti,
sono alle primissime armi in C++ mentre me la cavicchio in VB6.
Una domanda:

Ho fatto una semplicissima DLL in C++ cosi' congegnata:
- una funzione "scrivi_dato" riceve un valore numerico long e, per ora , lo scrive su un file di transito.

- una funzione "leggi_dato" legge il file di transito e restituisce il valore al chiamante.

Fin qui tutto bene:
pero' non mi va di dover scrivere questo valore su un file di transito come sto' facendo ora
e quindi mi sono definito una variabile globale in cui memorizzerei il dato.
Sembra banale la cosa, ma pero' non funziona ..
La variabile globale che ho definito (e che sono sicuro viene aggiornata da "scrivi_dato) viene vista a 0 da altri programmi che si connettono alla DLL e accedono a "leggi_dato .
Come se partisse una nuova istanza del programma tutte le volte .
Qualcuno mi aiuta? Ho la sensazione di annegare in un bicchiere d'acqua ..

Grazie in anticipo

Mauro

P.S. sto' usando il C++ BORLAND 5 ..

oregon
03-03-2009, 23:04
Il codice della DLL e' comune ai programmi che le utilizzano ma i dati no, ogni programma ha la propria istanza, a meno che non si dichiarino esplicitamente come condivisi.

Ma, lasciando perdere per un attimo questa possibilita', spiega un po' meglio cosa vuoi fare con quello che hai spiegato perche' non ho capito a cosa serva tutto cio' e, soprattutto, a cosa debba servire la DLL ...

ik1wvq
03-03-2009, 23:31
grazie.
mi spiego in 2 parole:
sono un radioamatore. c'e' un programma per pilotare un ricevitore (programma non modificabile) che permette agli utenti di personalizzare il dialogo con il ricevitore chiamando
certe funzioni di una DLL di un certo nome .. ognuno si fa la sua di DLL ..
Questo programma chiama la funzione "scrivi_dato" tutte le volte che deve comunicare
al ricevitore che e' cambiata la frequenza che deve ricevere..
Bene, il mio ricevitore e' gestito da un altro programma, anche questo non modificabile, e anche questo chiama la funzione "leggi_dato" in una DLL di nome specificabile (naturalmente specificato uguale alla DLL del primo programma) e si prende la frequenza su cui deve lavorare.
Si tratta di far transitare questo dato (un long) da un funzione all'altra della stessa DLL ...

ecco spiegato il mio problema ... non posso toccare i programmi di origine ..
Adesso l'ho fatto scrivendo il dato su un file di transito e va tutto BENISSIMO ..
Volevo fare una cosa piu' furba ..

Come si fa a dichiarare "esplicitamente come condivisa" questa variabile .

Scusa per lo sproloquio ma credimi che l'ho gia' sintetizzato molto ..

Ciaoo

grazie

Mauro

MItaly
03-03-2009, 23:36
Ma alla fine questa dll č la stessa per i due programmi? In questo caso puoi creare un segmento di memoria condiviso come spiegato qui (http://www.codeproject.com/KB/DLL/data_seg_share.aspx). In alternativa devi ricorrere ad altri metodi di IPC, come i memory-mapped file (http://www.codeproject.com/KB/DLL/data_seg_share.aspx).

oregon
03-03-2009, 23:37
Ok ... questo articolo

http://support.microsoft.com/kb/125677/en-us

dovrebbe esserti utile.

E' un po' vecchiotto ma dovrebbe funzionare ancora ... altrimenti fai un fischio.

XWolverineX
04-03-2009, 01:10
Se ho capito bene il pragma data_seg permette di definire anche segmenti di memoria condivisi tra piu' istanze di DLL?

Per esempio, mettendo un intero in una sezione condivisa, questo sarebbe uguali per tutti i programmi che usano la DLL?

Bellissimo...cosė si potrebbe contare quanti processi hanno mappato la dll in memoria...e regolarsi di conseguenza!

oregon
04-03-2009, 10:46
Originariamente inviato da XWolverineX
Se ho capito bene il pragma data_seg permette di definire anche segmenti di memoria condivisi tra piu' istanze di DLL?

Per esempio, mettendo un intero in una sezione condivisa, questo sarebbe uguali per tutti i programmi che usano la DLL?

Sė ... č fatto apposta ...


Bellissimo...cosė si potrebbe contare quanti processi hanno mappato la dll in memoria...e regolarsi di conseguenza!

Attenzione ... essendo un dato condiviso tra piu' programmi, va trattato con tutte le precauzioni del caso ... in generale, e' bene accedere tramite semafori e altre primitive simili.

ik1wvq
04-03-2009, 12:03
BENE , anzi BENISSIMO ..

Grazie a voi, e dopo la regolamentare serata di prove e toccheggiamenti ignobili sono riuscito a far funzionare la cosa ..

Se a qualcuno interessa ecco cosa ho fatto:

COMPILATORE BORLAND BCC32.EXE V 5.5.1 a riga di comando (quello FREE per capirsi)
.....
in .cpp :

#pragma data_seg("SegCond")
long g_LOfreq=0; // dicono che DEVE essere inizializzata ... obbedisco!
#pragma data_seg

......
in .def :

SEGMENTS
SegCond SHARED READWRITE

......
in .cfg (opzioni del compilatore BCC32.exe):

-zRSegCond

la variabile g_LOfreq viene aggiornata e letta da tutti i programmi che accedono alle 2 funzioni che la gestiscono:

extern "C"
int __stdcall __declspec(dllexport) SetHWLO(long freq)
{
g_LOfreq = freq;
return 0; // = tutto OK .. richiesto dal programma chiamante
}

.....

extern "C"
long __stdcall __declspec(dllexport) GetHWLO(void)
{
return g_LOfreq;
}


ecco tutto ..
Grazie ancora, mi siete stati utilissimi.. per voi e' una banalita', ma per me era buio pesto..

Saluti

Mauro

oregon
04-03-2009, 12:22
Originariamente inviato da ik1wvq
Grazie ancora ...

Di nulla ...

Interessanti i PIC ... e' da un po' che li programmo ... se vuoi una mano ...

ik1wvq
04-03-2009, 12:33
eheh .
ci lavoro sopra 10 ore al giorno .. mi escono un po' dalle orecchie ultimamente.
utilizzo un compilatore C della CCS a cui sono abituato ...
E' molto semplice da usare anche se non potentissimo (non ha il linker)

Adesso sto' utilizzando un DSPIC33 a 40mips per una applicazione in cui serve TANTA potenza di calcolo ...
Sono partito 10 anni fa con il mitico 16C84 e adesso uso solo i 18F e i DSPIC33 ..
confermo che sono bestioline carine, anche se in giro c'e' di "meglio" .. pero' quando uno conosce i propri polli cerca di non cambiarli, se riesce ..

Buoni PICs ..

Grazie ancora

Mauro

Loading