9
votes

Comment mettre à jour une DLL C ++ sans avoir besoin de relier l'EXE avec le fichier LIB?

Tout d'abord, je vous réfère à un compilateur Windows Environment et VC ++.

Ce que je veux pouvoir faire est de reconstruire une DLL VC ++ et de maintenir la compatibilité avec un EXE qui a déjà été lié à la lib sans devoir reconstruire l'EXE ni charger la DLL de manière dynamique à l'aide de LoadLibrary. En d'autres termes, existe-t-il un moyen d'ajouter des cours et des méthodes à une DLL (mais non supprimé) et d'assurer que les points d'entrée existants restent les mêmes?


0 commentaires

4 Réponses :


0
votes

Tant que vous n'ajoutez aucun symbole exporté, les ordinaux ne changeront pas. Si vous ajoutez des symboles exportés via le mécanisme standard de Dllexport, cela va être difficile à contrôler. Si vous utilisez l'ancien fichier de symbole de style .xpf, vous pourrez peut-être contrôler la commande des symboles dans la libère (bien que je ne sache pas cela à coup sûr - cela pourrait toujours les réorganiser cependant), mais c'est délicat de faire C ++ symboles de cette façon.


0 commentaires

8
votes

Si vous exportez les fonctions de l'utilisation d'un fichier DEF et spécifiez manuellement les ordinaux, vous devriez être capable de l'accomplir.

référence

http://msdn.microsoft.com/fr -us / bibliothèque / d91k01sh (vs.80) .aspx


2 commentaires

J'aimerais ajouter la référence MSDN.MicRosoft.com /en-us/Library/900axts6(vs.80).aspx Il est juste un clic à l'écart de l'hyperlien ci-dessus et discute des raisons d'utiliser des fichiers def et des avantages et des inconvénients.


Voici les liens de travail mentionnés dans la réponse et dans le commentaire, respectivement: docs.microsoft.com/en-us/cpp/build/... et docs.microsoft.com/en-us/cpp/build/...



0
votes

Je pense que les ordonnances sont rarement utilisées pour résoudre les importations de la DLL, je pense que vous devez utiliser des fichiers .def pour obtenir le lien pour les utiliser. Ainsi, tant que vous ne modifiez pas les noms ou les signatures des fonctions exportées, le .exe devrait fonctionner simplement bien.


0 commentaires

8
votes

Cela dépend de la manière dont votre exe a utilisé les classes de la DLL. L'ajout de nouvelles classes ne doit pas affecter les points d'entrée existants. En plus de cela, cependant, les éléments suivants affecteront la taille et / ou la disposition de l'objet, et comme ce sera un changement de client-rupture (note que c'est techniquement spécifique à la VC, mais la plupart d'entre eux s'appliquent à toute mise en œuvre SANE): < / p>

  • Retirer des champs (même privés) des classes
  • Ajout de nouveaux champs (même privés) aux classes
  • Ajout de nouvelles classes de base aux classes existantes
  • Suppression de classes de base des classes existantes
  • Ajout de nouvelle méthode virtuelle Avant une méthode virtuelle existante (ajout de nouvelles méthodes virtuelles après les personnes existantes est correcte, à l'exception du cas décrit au point suivant)
  • Ajout d'une nouvelle méthode virtuelle dans une classe utilisée comme classe de base par une autre classe dans la même DLL qui a également des méthodes virtuelles
  • Changement de type de champs existants
  • Modification de la signature des méthodes existantes
  • Faire une méthode virtuelle non virtuelle, et vice versa

4 commentaires

Je pense que c'est une bonne réponse, mais je changerais une chose: changer les méthodes virtuelles dans une classe de quelque manière que ce soit serait suspect. Je ne pense pas que vous puissiez compter sur la tablette pour avoir les fonctions virtuelles dans la même commande que celle indiquée dans le fichier source.


En VC au moins, vous pouvez compter sur cela - il s'agit de la condition préalable au support COM (qui nécessite une commande de la table équitable définie).


Grande réponse Pavel, je me demande simplement si vous pouviez ajouter des références afin de soutenir vos affirmations. Merci!


@David, c'est surtout la connaissance de 1) Compréhension des techniques de mise en œuvre typiques (VTABLES ETC) et 2) Expérience. La principale source ici serait la spécification ABI pour un compilateur particulier. En ce qui concerne les sources secondaires, KDE DOCS a une liste similaire à la mine ici: TechBase.kde.org/policies/binary_compatibility_issues_with_c ++ - et la recherche générale de la «compatibilité binaire C ++» devrait donner quelques résultats plus pertinents.