9
votes

Lier statilement une DLL dans Windows

Considérez cette situation:

Je crée une DLL (appelons cette DLLA), qui, à son tour, appelle des fonctions dans d'autres DLL (appelons ces DLLX, Dlly et Dllz). Si quelqu'un d'autre souhaitait utiliser DLLA, ils auraient également besoin d'une copie de DLLX, Y et Z.

Y a-t-il un moyen de construire DLLA de sorte que les fonctions nécessaires dans DLLX, Y et Z sont liées à DLLA? Je ne sais pas s'il s'agit de la bonne terminologie, mais cela est-il appelé "lier de manière statique d'une DLL"?

Je cherche une solution simple. Je serais heureux avec quelque chose de brut qui concaté simplement Dllx, Y et Z et ajoute que à DLLA, si une telle chose existe. Mais j'ai ce mauvais sentiment qu'il n'y a pas de solution facile à cela.

Je suis sur Windows, en utilisant vs.

Merci!


1 commentaires

Avez-vous le code source de toutes les DLL?


3 Réponses :


2
votes

Je ne crois pas que vous puissiez. Je n'ai pas entendu parler de cela. Si vous avez accès à vos autres DLL, vous pouvez les construire en tant que bibliothèques statiques et qui fonctionneront comme vous le souhaitez, mais il y a une raison pour laquelle ils s'appellent Dynamic Link Bibliothèques.

edit: vient de trouver ce fil .


0 commentaires

9
votes

Vous ne pouvez pas joindre statiquement une DLL, seulement une lib. Les DLL sont autonomes et ont des membres statiques et des dépendances de charge / déchargement DLLMain qui signifie qu'elles ne peuvent pas être divisées en fonctions et liées à un exécutable différent.

Vous devez créer un installateur qui déploie toutes les DLL appropriées, au besoin.

Si vous pensez vraiment que cela est important et que vous ne pouvez pas compter sur votre programme d'installation de l'application, vous pouvez créer une enveloppe qui incorpore les DLL indispensables (A, X, Y et Z) au fur et à mesure que les ressources et à l'exécution les extrait et les écrivent sur le disque Les dossiers de Temp Profil de l'utilisateur, chargent ensuite la DLLA extraite et se détachent tous les appels de fonction entrants vers la DLLA chargé. Certains des outils Sysinternals utilisaient des techniques similaires pour extraire X64 images de l'application à partir de l'image X86 et relanant eux-mêmes sous forme de processus 64 bits sans avoir à expédier deux exemples distincts.


1 commentaires

J'aime cette idée d'extraire la DLL dans le dossier Temp ... n'importe quel exemple / tutoriel sur la façon de le faire?



7
votes

Techniquement, vous ne pouvez pas lier statiquement une DLL, mais ' liaison implicite 'est équivalente à celle-ci.

  1. Inclure les déclarations de fichiers d'en-tête utilisant le spécificateur __DECLSPEC (DLLIMPORT) dans l'exécutable.
  2. Un .lib du même nom que la DLL est généré avec la DLL lorsqu'elle est construite, appelée sa "bibliothèque d'importation". Link this Lib à exécuter.
  3. Place DLL à côté d'EXE.

    Ensuite, Windows chargera la DLL chaque fois que l'EXE est appelé, agissant efficacement comme une lib.


0 commentaires