J'ai une DLL déchargée dynamiquement chargée & qui nécessite COMCTL32.dll> = v6.0 et MSVCR> = v9.0. Pour vous assurer que les versions correctes sont chargées, activer la génération de fichier manifeste dans un cadre de projet Visual Studio et ajouter cette entrée à un autre fichier manifeste:Une fuite de handle de fichier sur une DLL chargée dynamiquement provoquée par le contexte d'activation
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
Dans un programme de test que j'appelle LoadLibrary()
suivi par FreeLibrary()
de cette DLL et ProcessExplorer indique que les descripteurs de fichiers suivants ont été divulgués:
- C: \ WINDOWS \ WinSxS \ x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_6f74963e
- C: \ WINDOWS \ WinSxS \ x86_Microso ft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83
De trace le démontage de la pile d'appel j'ai appris que le LoadLibrary()
, un contexte d'activation a été automatiquement créé et il ouvre les poignées à chacun de ces dossiers. Mais il semble que le contexte d'activation ne soit pas supprimé sur FreeLibrary()
.
Si je supprime les fichiers manifest et que vous définissez les paramètres du projet pour désactiver la génération de manifeste, ces fuites ont disparu. Cependant, de cette façon, je serai incapable de m'assurer que les MSVCR et COMCTL corrects sont utilisés, puisque cette DLL est chargée par des processus sur lesquels je n'ai aucun contrôle.
Existe-t-il un moyen de supprimer cette fuite sans supprimer les fichiers manifest?
Merci!
Merci pour votre réponse. J'ai essayé cela plus tôt, et pour chaque paire LoadLibrary - FreeLibrary, il y a deux nouvelles handles de fichiers montrés dans ProcessExplorer. J'ai enregistré les données de processus à différents points et les diff pour être sûr. – edwinbs