Toon posts:

[C++] Singleton vanuit DLL

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb het volgende probleem. Ik heb een logging class die ik altijd beschikbaar wil hebben. Ik heb weinig behoefte om deze iedere keer door te geven via de constructor dus heb ik hier een singleton van gemaakt. De singleton kent de volgende Instance() methode

code:
1
2
3
4
5
6
7
8
9
LogSystem *LogSystem::Instance(void)
{
   static LogSystem *pInstance = NULL;

   if(pInstance == NULL)
       pInstance = new LogSystem();

   return pInstance;
}


Dit werkt prachtig. Deze klasse zit in een statische library met nog een aantal platform afhankelijke methodes en klasses. Het hoofdprogramma wordt gelinkt aan deze library. Wanneer ik een linux variant van hetzelfde programma wil dan link ik hem gewoon aan een linux variant van dezelfde statische library.

Tot dusver geen problemen. Het hoofdprogramma gebruikt altijd dezelfde instantie van de LogSystem klasse. Echter wordt er op den duur een DLL dynamisch geladen. Deze DLL wordt ook gelinked met dezelfde statische klasse (hij gebruikt ook platform afhankelijke onderdelen). Wanneer de DLL dezelfde singleton aanroept dan wordt de constructor van LogSysteem gewoon voor een 2e keer uitgevoerd. Logischerwijs omdat de DLL in zijn eigen geheugen blok zit, naast het hoofdprogramma.

Wat ik dus eigenlijk wil is een static library met hierin een class voor het loggen van meldingen die zowel vanuit de DLL als uit het programma kan worden aangeroepen zonder dat ik iedere keer een referentie door moet geven. (Ik zou immers een virtual interface op kunnen stellen voor LogSystem en die door kunnen geven aan de DLL. Kan dit ook via de DllMain methode? Zo ja, is dit ook mogelijk op andere platformen?)

Hoe kan ik dit het mooiste doen? Uiteraard ben ik op zoek naar een oplossing die technisch mooi is en ook onderhoudbaar is. Ik heb echter nog geen pattern gevonden die doet wat ik graag wil dat ie moet doen.

B.v.d.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 24-04 11:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op dinsdag 15 november 2005 @ 15:30:
Ik heb het volgende probleem. Ik heb een logging class die ik altijd beschikbaar wil hebben. Ik heb weinig behoefte om deze iedere keer door te geven via de constructor dus heb ik hier een singleton van gemaakt. De singleton kent de volgende Instance() methode

C++:
1
2
3
4
5
6
7
8
9
LogSystem *LogSystem::Instance(void)
{
   static LogSystem *pInstance = NULL;

   if(pInstance == NULL)
       pInstance = new LogSystem();

   return pInstance;
}
Waarom niet:
C++:
1
2
3
4
5
LogSystem * LogSystem::Instance()
{
    static LogSystem instance;
    return &instance;
}

Dan wordt ie ook automatisch gedestruct als je programma stopt.
Wat ik dus eigenlijk wil is een static library met hierin een class voor het loggen van meldingen die zowel vanuit de DLL als uit het programma kan worden aangeroepen zonder dat ik iedere keer een referentie door moet geven. (Ik zou immers een virtual interface op kunnen stellen voor LogSystem en die door kunnen geven aan de DLL. Kan dit ook via de DllMain methode? Zo ja, is dit ook mogelijk op andere platformen?)
Wat is er mis met een eigen functie in de DLL definieren aan wie je de LogSystem instance door kunt geven? Werkt zowel onder windows als linux. Beetje raar om hier de DllMain voor te misbruiken, die jouw applicatie bovendien niet zelf aanroept maar door het OS wordt aangeroepen als je een LoadLibrary doet.
Hoe kan ik dit het mooiste doen? Uiteraard ben ik op zoek naar een oplossing die technisch mooi is en ook onderhoudbaar is. Ik heb echter nog geen pattern gevonden die doet wat ik graag wil dat ie moet doen.
Je kan je logger ook in een aparte dll zetten, dan wordt ie geshared tussen dll en de main applicatie.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
.oisyn schreef op dinsdag 15 november 2005 @ 15:56:
[...]


Waarom niet:
C++:
1
2
3
4
5
LogSystem * LogSystem::Instance()
{
    static LogSystem instance;
    return &instance;
}

Dan wordt ie ook automatisch gedestruct als je programma stopt.
Geen gek plan, aangepast.
[...]

Wat is er mis met een eigen functie in de DLL definieren aan wie je de LogSystem instance door kunt geven? Werkt zowel onder windows als linux. Beetje raar om hier de DllMain voor te misbruiken, die jouw applicatie bovendien niet zelf aanroept maar door het OS wordt aangeroepen als je een LoadLibrary doet.
Ik was alleen maar hardop aan het nadenken :P. Op het moment dat ik een andere variant van de DLL in de juiste directory plaats wil ik gebruik kunnen maken van het log systeem. Het kan dus zo zijn dat de DLL die er voorheen stond geen gebruikt van het logsysteem en dus geen referentie krijgt toegeschoven. Ofwel, het is flexibeler om LogSystem gewoon beschikbaar te maken. Scheelt ook weer redundante code :P
[...]

Je kan je logger ook in een aparte dll zetten, dan wordt ie geshared tussen dll en de main applicatie.
Dat kan uiteraard, maar dan ben ik nog niet van de problemen af m.b.t. het vaker aanroepen van de constructor. Of zie ik dit verkeerd?

B.v.d.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 24-04 11:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Jawel, want elk stukje code (je main app en de externe dll) maken van dezelfde interface gebruik. De Instance() functie zit namelijk in een andere dll.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.