Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    4

    varibili globali e DLL in C++

    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 ..

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    4
    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

  4. #4
    Ma alla fine questa dll è la stessa per i due programmi? In questo caso puoi creare un segmento di memoria condiviso come spiegato qui. In alternativa devi ricorrere ad altri metodi di IPC, come i memory-mapped file.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    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!
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    4
    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

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da ik1wvq
    Grazie ancora ...
    Di nulla ...

    Interessanti i PIC ... e' da un po' che li programmo ... se vuoi una mano ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    4
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.