2009-12-09 8 views
1

Notre industrie est en calcul distribué parallèle haute performance. Nous avons une application C++ non gérée en cours de développement en utilisant Visual Studio 2008.Unmanaged C++: Comment charger dynamiquement du code?

Notre application (plus comme un framework) est supposée être capable de charger dynamiquement du code (algorithmes) développé par des tierces parties (il peut y avoir beaucoup de dll) qui est conforme à notre spécification d'interface, et appelle le code chargé pour obtenir des résultats.

penser comme vous voulez appeler une fonction sin (x), mais il y a beaucoup de différentes implémentations de sin (x) que vous pouvez utiliser.

J'ai quelques questions que je suis très nouveau dans ce domaine de charger dynamiquement du code:

  1. est dll (bibliothèque de liens dynamiques) la réponse à ce type d'exigence?
  2. Si le 3e parti a utilisé un autre type de IDE pour créer la dll par rapport à la mienne (Eclipse CDT dire, C++ Builder, Visual C++ 6.0, etc.), serait le dll travailler encore avec ma demande?
  3. Notre application est censé fonctionner multiplateforme et (devrait être en mesure de fonctionner sous Linux), serait utilise QLibrary la façon la plus logique de abstraire tout le chargement dll spécifique à la plateforme?
  4. (FACULTATIF) Y a-t-il des problèmes imprévus que je pourrais rencontrer?

Répondre

1
  1. Oui, c'est. Mais il y a beaucoup de problèmes.
  2. Peut ou non. Tout d'abord, vous devriez être au courant de calling conventions. Deuxièmement, puisqu'il n'y a pas d'ABI standardisé pour le C++, vous devriez vous en tenir au niveau C de l'interface (Btw, la technologie COM était tout à fait à propos de ceci - faire un ABI standardisé). Troisièmement, chaque plugin peut avoir son propre CRT et donc des problèmes peuvent apparaître, il y a un bon article à ce sujet sur MSDN.
  3. Oui, cela facilitera le chargement de bibliothèques dynamiques, mais pas de problèmes dans (2). Bien que, ces problèmes surtout des fenêtres spécifiques.
3

1) En général, oui. Si l'API devient complexe et multi-objet, j'utiliserais COM ou un mécanisme similaire. Mais si vous devez gérer seulement un petit état, ou peut aller complètement sans état, une interface DLL pure est très bien.

2) Utiliser une convention d'appel approprié (stdcall) et les types de données. Je ne dirais même pas que l'implémentation doit être en C++. ce qui signifie char/wchar_t, ints de taille explicite, par ex. int32, float et double, et les tableaux de style C d'entre eux.

3) ne peut pas dire

4) Aucune allocation de mémoire transfrontalières: libre ce que vous allouez, et laisser le plugin gratuitement ce qu'il a alloué.

Votre conception API a une grande influence sur les performances réalisables et les efforts de mise en œuvre. Ne pas faire les fonctions à petit, donner la mise en œuvre une certaine liberté la façon dont il gère certaines choses, définir le protocole d'erreur, les exigences de filetage etc.

[modifier]
Aussi, si vous déclarez des structures, regardez en alignement et les options du compilateur pour contrôler cela (généralement #pragma pack). Ceci est requis pour que les clients voient la même mise en page.

Le compilateur "trompe" généralement les noms pour les symboles exportés (par exemple, ajouter un udnerscore pour la convention STDCALL). En règle générale, cela est contrôlé via un fichier .def qui est transmis à l'éditeur de liens.

+0

J'ai lu sur Wiki, et il me semble que la plate-forme de programmation évolue à partir de DLL -> COM -> COM + -> .NET? Si oui, dois-je simplement utiliser COM à la place? – sivabudh

+0

Cela dépend vraiment de la complexité. Le développement COM peut être douloureux, OTOH COM résout certains des problèmes que vous rencontrerez de toute façon lorsque l'interface devient plus complexe. Si l'API est plutôt simple et que vous n'avez aucune expérience préalable avec COM, je déconseille. – peterchen

0

Selon mon expérience, QLibrary est la meilleure réponse à vos questions. Il fournit une interface simple et prend en charge tous les détails spécifiques à la plate-forme. En effet, cela signifie que les plugins doivent également être écrits en utilisant QT.

Questions connexes