У меня есть динамично загруженный и разгруженный DLL, который требует COMCTL32.dll> = v6.0 и MSVCR> = v9.0. Чтобы гарантировать, что правильные версии загружаются, я включаю поколение файла манифеста в установке проекта Visual Studio и добавляю эту запись в другой файл манифеста:
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
В тестовой программе я звоню LoadLibrary()
сопровождаемый FreeLibrary()
из того, что DLL и ProcessExplorer указывают, что следующие Дескрипторы файлов были пропущены:
От дизассемблирования, которое прослеживает стек вызовов, я изучил это на LoadLibrary()
, контекст активации был автоматически создан, и он открывает дескрипторы для каждой из этих папок. Но кажется, что контекст активации не удален на FreeLibrary()
.
Если я удаляю файлы манифеста и устанавливаю настройки проекта для отключения явного поколения, этих утечек не стало. Однако тот способ, которым я буду не мочь удостовериться, что корректный MSVCR и COMCTL используются, начиная с этого DLL, загружается процессами, я не имею никакого контроля.
Существует ли способ удалить эту утечку, не удаляя файлы манифеста?
Спасибо!
Эти дескрипторы могут не утекать - просто кэшироваться. Если вы измените свою тестовую программу так, чтобы она загружала и выгружала вашу DLL несколько раз, увидите ли вы, что при каждой выгрузке DLL происходит утечка новой пары хэндлов? Если нет, то это не проблема.