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? P>
3 Réponses :
DLL est entièrement chargé. Les DLL sont identiques que les exètes dans presque em> tous les aspects; La différence gros em> entre eux est, les DLL ne sont pas exécutables. Il n'a pas main () code> fonction - Le début d'un programme . P>
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 i> et désinitialiser i> fonction!
C'est comme une bibliothèque partagée qui est liée à votre exécutable de manière dynamique: p
@ARMEN: dllmain code> est facultatif. Il peut être omis lors de l'utilisation du liant / noountrypoint code>.
Il est entièrement chargé, comme l'a souligné. La partie spéciale n'est pas que vous ne pouvez pas exécuter em> la DLL, c'est que les pages de mémoire d'une DLL sont généralement partagées entre les limites de processus. P>
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). P>
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 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. P> invalid_handle_value code>) à 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>. p>
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 ...
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. P>
dlls sont
+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 Code> Linker. Voir MSDN.MICROSOFT.COM/EN-US/LIBRARY/151KT790.ASPX a>
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.
+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.