PDA

Visualizza la versione completa : [C++] Condivisione variabile tramite DLL


CyberCrasher
05-10-2012, 17:28
Ciao a tutti,
ho un altro problema da risolvere che accantono da diverso tempo.

Semplificando le cose:


//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 :(

c0der
05-10-2012, 18:23
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, ...

CyberCrasher
05-10-2012, 18:25
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?

c0der
05-10-2012, 18:37
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/misc/ipctechniques/article.php/c305/Sharing-Data-Between-Different-Instances-of-the-Same-Module-DLL-or-EXE.htm

CyberCrasher
05-10-2012, 18:54
Purtroppo quell'esempio lo avevo gi trovato ma non mi stato di nessun aiuto.

c0der
05-10-2012, 19:20
Non ho tempo di fare un esempio ma in rete si trovano un sacco di esempi.
Provo un altro: http://goo.gl/rL1Av

CyberCrasher
06-10-2012, 09:02
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

:dh: :dh: :dh: :dh: :dh:

CyberCrasher
06-10-2012, 09:25
Posto un po' di codice cos vediamo se l'errore viene fuori:

Dll.cpp:

#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

LIBRARY WifiMonitorDLL.dll
EXPORTS
getShared
setShared

Process1.cpp

int __stdcall getShared();
void __stdcall setShared(int i);

cout << getShared(); // 1
setShared(5);
cout << getShared(); // 5

Process2.cpp

int __stdcall getShared();
void __stdcall setShared(int i);

cout << getShared(); // 1

Eseguendo prima Process1, in Process2 dovrei vedere 5 ma non succede

Loading