8
votes

Une DLL est-elle chargée entièrement ou seulement certaines fonctions?

Lorsqu'un programme utilise une bibliothèque partagée dynamique, chargez-t-il entièrement la DLL (vous pouvez donc presque effacer la DLL à partir du disque lors de l'application est en cours d'exécution) ou ne charge qu'une partie de la DLL en fonction de son besoin à chaque fois Pendant la durée de vie de l'application?


5 commentaires

+1, mais comment est-ce lié à C ++?


Parce que je parle spécifiquement sur C ++ .exe qui utilise une DLL, mais peut-être aussi peu importe la programmation de langage à utiliser le comportement est toujours le même


En utilisant LoadLibrary () met un verrou sur le fichier DLL. Vous pouvez le renommer mais vous ne pouvez pas y écrire.


@HANS: OK, il est donc parfaitement valide si je renomme DLL FLILE, remplacez-le par un nouveau WICH sera chargé lors du démarrage des applications suivantes?


Oui. Vous pouvez supprimer la DLL renommée après.


3 Réponses :


7
votes

DLL est entièrement chargé. Les DLL sont identiques que les exètes dans presque tous les aspects; La différence gros entre eux est, les DLL ne sont pas exécutables. Il n'a pas main () fonction - Le début d'un programme .


4 commentaires

En outre, une DLL a une fonction DLLMain qui est appelée lorsque la DLL est chargée et déchargée.


@Armen: Ouais. Mais dllmain est plus comme initialiser et désinitialiser fonction!


C'est comme une bibliothèque partagée qui est liée à votre exécutable de manière dynamique: p


@ARMEN: dllmain est facultatif. Il peut être omis lors de l'utilisation du liant / noountrypoint .



0
votes

Il est entièrement chargé, comme l'a souligné. La partie spéciale n'est pas que vous ne pouvez pas exécuter la DLL, c'est que les pages de mémoire d'une DLL sont généralement partagées entre les limites de processus.

Si un processus tentative d'écrire dans une page, une copie de cette page est prise et que la copie n'est visible que sur ce processus (elle s'appelle Copy-on-Write).

Les dlls sont des fichiers PE (c'est-à-dire les mêmes que les pilotes NT ou les programmes Win32). Ils sont chargés de la même manière que les fichiers .exe dans des fichiers mappés en mémoire (MMF ou des "sections" dans le langage en mode noyau). Cela signifie que le fichier DLL recule du MMF qui représente la DLL chargée. C'est la même chose que lors du passage d'une poignée de fichier valide (pas invalid_handle_value ) à CreateFilemapping et c'est aussi (une partie de) la raison pour laquelle Vous ne pouvez pas supprimer la DLL lorsqu'il est utilisé sur < / fort>.

En outre, certaines DLL ne contiennent aucun code du tout. Une telle DLL peut également être chargée dans un processus qui n'a pas été fait pour le même processeur. Par exemple. La DLL de la ressource X86 charge l'amende dans une application X64.


1 commentaires

J'ai une application dans la production qui ne peut pas être arrêtée, et je dois changer la version DLL, je l'ai fait pendant la demande était en hausse ...



4
votes

Je ne sais pas comment les détails fonctionnent dans Windows (à Linux, je connais assez bien le code responsable du noyau), mais au moins dans * Nix Systems supprime une entrée de système de fichiers quitte le contenu du fichier intact aussi longtemps qu'il existe un fichier Descripteur / poignées ouvertes dessus.; Seulement après la fermeture du dernier descripteur de fichier / gérer les blocs sur le périphérique de stockage peut être écrasé. Windows est certifié POSIX, il suit donc ce comportement.

dlls sont non chargés dans la mémoire préallocate. Ils sont la mémoire mappée . Cela provoque une sorte d'inverse de la mémoire de swap. Au lieu d'échanger la RAM sur un disque, le contenu du fichier est mappé dans l'espace d'adressage de processus et se retrouvera dans la RAM via le cache de disque / fichier. Il en va de même pour les objets partagés dans les systèmes d'exploitation * Nix. Mais il existe des différences significatives entre Windows et * Nix Systems traitent des délocalisations, des exportations de symboles et ainsi de suite.


10 commentaires

+1. Ils sont en effet des mmfs et l'échange inversé est une bonne image pour expliquer les MMF en général.


Un comportement similaire peut être mis en œuvre dans les fichiers Windows DLL à l'aide du drapeau / DelaLoDload Linker. Voir MSDN.MICROSOFT.COM/EN-US/LIBRARY/151KT790.ASPX


Mais j'ai réussi à écraser la DLL alors que l'application était en place


@ Guillaume07: L'écrasement est différent de la suppression de l'entrée du système de fichiers. Cela "corrompt" le contenu.


@Status_Access_Denied: L'échange inversé n'est pas un moyen d'expliquer cette chose. Sous Linux, le code responsable du swapping de la page traite également de l'accès au fichier mappé de mémoire. Je ne connais pas les détails de la façon dont Windows le fait cependant, mais il est probablement similaire.


@DATENWOLF: Eh bien, cela détient également pour Windows. Les mécanismes sont également partagés ici. Cependant, donc ce n'est pas un moyen d'expliquer cela ... hein? J'ai dit que c'était une bonne façon de l'expliquer (à quelqu'un sans connaissance des nethers du système), c'est-à-dire que j'ai appuyé votre argument et maintenant vous dites que ce n'est pas ... ah bien, c'est au-delà de moi. L'anglais n'est pas ma langue maternelle, alors ce serait ça: - |


@ Guillaume07: Pouvons-nous voir du code? Je suis conscient de certaines techniques qui ont fonctionné jusqu'à XP SP1 ou donc pour les fichiers .exe, mais je n'ai jamais rien vu faire ce que vous prétendez purement du mode utilisateur.


@Status_Access_Denied: Je n'ai pas nié, j'ai dit que mon argument n'était pas seulement un simple exemple, mais la chose réelle. Je voulais juste signaler cela, puisque votre premier commentaire peut tromper certaines personnes qu'il existe des mécanismes différents au travail (+1 pour votre premier commentaire).


@ André Caron: Pouvez-vous expliquer les dlls chargés par retard avec l'explication de DatenWolf ou la question initiale, s'il vous plaît.


@datenwolf: Je vois. Ma faute. On dirait que l'on ne peut pas éditer un commentaire après un certain temps, je ne peux donc pas le réparer là-bas. Merci pour le +1.