Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C++] Condivisione variabile tramite DLL

    Ciao a tutti,
    ho un altro problema da risolvere che accantono da diverso tempo.

    Semplificando le cose:
    codice:
    //Process1.cpp
    __declspec(dllimport) int variabile;
    
    //Process2.cpp
    __declspec(dllimport) int variabile;
    
    //Dll.cpp
    __declspec(dllexport) int variabile=44;
    In questa situazione ogni processo è in grado di accedere ed utilizzare la variabile (leggendo anche il contenuto 44) ma se un processo modifica il valore della variabile, l'altro non rileva la modifica.
    Presumo quindi che la condivisione della variabile sia fasulla perchè di fatto la variabile viene mappata in uno spazio di memoria diverso per ciascun processo.
    Come posso condividere realmente tale variabile usando la dll?

    Ho letto dell'utilizzo di #progma data_seg ma provando ad applicarlo non è cambiato niente.
    Grazie anticipatamente per le risposte

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Se bastasse una dll per condividere un dato non avrebbero inventato la sharerd memory,
    l'interprocess communication (ipc), il message passing, le pipe, l'mmap, ...

  3. #3
    Non posso utilizzare data_seg?

    Provando a mettere il seguente codice nel dll.cpp, da process1 e process2 viene fuori un errore di compilazione ovvero di variabile non trovata.

    #pragma data_seg(".TEST_SHARED")
    char var[30] = {0};
    #pragma data_seg()
    #pragma comment(linker, "/section:.TEST_SHARED,RWS")

    Mi date una mano per favore?

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Questo pragma data_seg dev'essere una cosa specifica di windows,
    non ne ero a conoscenza.
    Qui anche se vecchio c'è un esempio completo:
    http://www.codeguru.com/cpp/misc/mis...DLL-or-EXE.htm

  5. #5
    Purtroppo quell'esempio lo avevo già trovato ma non mi è stato di nessun aiuto.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Non ho tempo di fare un esempio ma in rete si trovano un sacco di esempi.
    Provo un altro: http://goo.gl/rL1Av

  7. #7
    Ho letto l'esempio passo passo ed è esattamente quello che io avevo già provato sperimentalmente ma l'effetto è lo stesso, ovvero i processi accedono alle funzioni get\set e ma la modifica da parte di un processo non è visibile dall'altro.

    Tuttavia il link che mi hai postato mi risulta utile perchè mi fa capire che il procedimento è corretto e che il problema è altrove.
    Sto pensando che in fase di compilazione, ogni progetto si crea una copia della sulla dll nella sua cartella e mi sorge il dubbio che possa essere proprio questa la causa del problema. Secondo voi c'entra qualcosa?

    [EDIT] Niente da fare.. ho provato a mettere i due processi nella stessa directory condividendo lo stesso file .dll ma il risultato non è cambiato


  8. #8
    Posto un po' di codice così vediamo se l'errore viene fuori:

    Dll.cpp:
    codice:
    #pragma data_seg("DLL_SHARED")
    int sharedint = 1;
    #pragma data_seg()
    #pragma comment(linker, "/section:DLL_SHARED,RWS")
    
    int __stdcall getShared(){
    	return sharedint;
    }
    
    void __stdcall setShared(int i){
    	sharedint = i;
    }
    Dll.def
    codice:
    LIBRARY WifiMonitorDLL.dll
    EXPORTS
    getShared
    setShared
    Process1.cpp
    codice:
    int __stdcall getShared();
    void __stdcall setShared(int i);
    
    cout << getShared(); // 1
    setShared(5);
    cout << getShared(); // 5
    Process2.cpp
    codice:
    int __stdcall getShared();
    void __stdcall setShared(int i);
    
    cout << getShared(); // 1
    Eseguendo prima Process1, in Process2 dovrei vedere 5 ma non succede

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.