2009-06-17 6 views
1

Je suis assez sûr que ce problème n'est pas nouveau, et assez sûr que c'est difficile à résoudre. J'espère que j'ai tort à propos de ce dernier. J'essaie d'utiliser le Loki :: Singleton de Modern C++ Design dans un de mes programmes.Obtenir Loki Singleton pour travailler dans DLL dans VS 2008 C++

Cependant, je n'arrive pas à l'obtenir pour fonctionner sur les DLL. Je pense savoir pourquoi cela se produit: le code basé sur un modèle est instancié dans chaque module source, donc au lieu d'une variable globale, chaque module a le sien.

De toute évidence, cela rend le Singleton très non-unique.

Est-il possible de contourner ce problème?

Répondre

2

Je vois dans le répertoire source de Loki qu'ils ont un SingletonDLL directory spécifique sous test, on dirait qu'ils utilisent un modèle exporté explicitement instancié (ce qui fonctionnerait). J'espère que cela contient le code que vous voulez.

+0

Merci, Todd! Cela a semblé fonctionner, et j'ai trouvé ceci [article de KB] (http://support.microsoft.com/kb/168958) qui explique en profondeur ce que l'exemple de code de SingletonDll (dans Loki) fait.C'est difficile de fonctionner correctement (avec tous les declspecs et autres), et cela me laisse toujours avec du code comme m_tick_file = Tick_File_Factory :: Instance() .CreateObject ("OHLC_File")); dans mes applications. Je pense que je pourrais finir par ajouter des fonctions membres statiques à Tick_File, qui utilise en interne les trucs de Loki, alors je sais que les templates ne sont installés qu'une seule fois, dans le fichier .cpp pour Tick_File –

0

Vous avez probablement raison que chaque DLL possède sa propre instance du singleton. Je ne suis pas très familier avec l'implémentation de Loki et le source code n'est pas très amusant à comprendre.

solutions possibles sont les suivantes:

  • Ne pas utiliser singletons. C'est en fait ma préférence habituelle parce que vous pouvez éviter des catégories entières de problèmes en changeant votre conception pour n'en pas avoir besoin. Pour une longue diatribe sur pourquoi singletons peuvent être nocifs voir this poste Yegge. Je ne suis pas si véhément contre eux, mais 95% du temps Singletons causer beaucoup plus de problèmes qu'ils ne résolvent (s'ils résolvent réellement)
  • Copier des membres statiques à travers les limites de la DLL. J'ai également fait cela comme un hack, où la DLL obtient un pointeur d'une application ou d'une autre DLL, et réinitialise sa propre copie du membre de classe statique au pointeur passé de l'extérieur. C'est diabolique, c'est sale, on ne peut pas nettoyer après, mais ça marche.
+0

Si vous déprécié, s'il vous plaît commenter aussi bien pourquoi. –

1

Notez que cela ne va pas résoudre la question. Un explicitement instancié et singleton exporté devrait faire l'affaire ...

-Rick

Découvrez #pragma data_seg here essentiellement, vous devez déclarer une instance du singleton dans une section commune de votre code. Par défaut, les statistiques sont étendues à la DLL.

Il peut être difficile avec les modèles, mais c'est le chemin du succès ici qui n'implique pas de passer/copier des données statiques autour.

+0

J'ai appris quelque chose de nouveau aujourd'hui. Merci! –

+1

Cela ne semble pas faire ce que je veux. L'utilisation de #pragma data_seg me permet de partager des données entre les PROGRAMMES. Le problème que j'ai est de partager entre DLL. En fait, les restrictions sur la page que vous avez désignée indiquent explicitement "Chaque processus possède son propre espace d'adressage Il est très important que les pointeurs ne soient jamais stockés dans une variable contenue dans un segment de données partagé. une application mais pas dans une autre. " Et le Singleton utilise des pointeurs en interne. –

+0

vous avez raison, désolé. La réponse de Todd ci-dessous est correcte. – Rick

Questions connexes