Singleton Pattern in DLL Prozessübergreifend nutzen.
-
Hallo,
folgendes ist mein Problem. Ich habe eine Klasse die ich aus einer statischen MFC-DLL heraus exportiere.
Hier mal der Aufbau:
class __declspec(dllexport) CSingletonAPI { public: static CSingletonAPI* GetSingleObject(void); void SetNumber(int nr); int GetNumber(void); private: CSingletonAPI(void); CSingletonAPI(const CSingletonAPI &obj); CSingletonAPI& operator=(CSingletonAPI const&); ~CSingletonAPI(void); static CSingletonAPI* m_pInstance; int m_cNumber; };
Nun möchte ich das jeder Prozess der diese DLL verwendet die gleiche Objekt Instanz verwendet. Deshalb deklariere ich das Objekt im Shared Memory.
#pragma data_seg(".SingletonDLL") CSingletonAPI* CSingletonAPI::m_pInstance = NULL; #pragma data_seg() #pragma comment(linker, "/section:.SingletonDLL,RWS")
Jetzt nutzen zwei GUI Anwendungen diese DLL. In der Anwendung (A) mache ich folgendes.
CSingletonAPI *a = CSingletonAPI::GetSingleObject(); a->SetNumber(1234);
Jetzt starte ich Anwendung (B) die ebenfalls diese DLL nutzt und dort führe ich
folgende Aktion aus.CSingletonAPI* b = CSingletonAPI::GetSingleObject(); int number = b->GetNumber();
Erwartet habe ich ehrlich gesagt das ich jetzt die Nummer "1234" als Rückgabewert bekomme. Dies ist aber nicht der Fall, sondern ich bekomme irgendeine eine int Zahl zurück.
Und da liegt mein Problem. Ich bin davon ausgegangen das wenn ich ja auf die selbe Objekt Instanz zurück greife, dass ich auch auf die Zustände der Variablen und Objekte zurückgreifen kann. Da ich ja im Speicher immer nur dieses nutzt ( zumindest meine ich es zu nutzten).
Da dies ein Problem ist was ich lösen muss Frage ich mich wenn dies so nicht möglich ist, wie kann man es dann lösen.
Es wäre super wenn mir da jemand auf die Sprünge helfen könnte.
Gruß
Wildcard
-
Das kann nicht gehen, denn der Zeiger den Prozess A setzt ist in Prozess B ungültig.
-
Kannst du mir denn eine Möglichkeit nennen, wie man dies lösen könnte.
Weil mein Problem ist das auf jeden Fall ein Prozess diese mit der Funktionaliät nutzt und dabei darf auch nur einmal das Objekt instanziert werden.
Ein zweiter Prozess braucht nur teile der DLL aber muss auf das bereits vorhandene
zurück greifen können.
-
Bau Dir was als Memory Mapped File auf.
So geht das nicht.