Утечка дескриптора файла на динамично загруженном DLL вызывается контекстом активации

У меня есть динамично загруженный и разгруженный 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 указывают, что следующие Дескрипторы файлов были пропущены:

  • C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_6f74963e
  • C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83

От дизассемблирования, которое прослеживает стек вызовов, я изучил это на LoadLibrary(), контекст активации был автоматически создан, и он открывает дескрипторы для каждой из этих папок. Но кажется, что контекст активации не удален на FreeLibrary().

Если я удаляю файлы манифеста и устанавливаю настройки проекта для отключения явного поколения, этих утечек не стало. Однако тот способ, которым я буду не мочь удостовериться, что корректный MSVCR и COMCTL используются, начиная с этого DLL, загружается процессами, я не имею никакого контроля.

Существует ли способ удалить эту утечку, не удаляя файлы манифеста?

Спасибо!

1
задан Hans Passant 10 July 2010 в 17:07
поделиться

1 ответ

Эти дескрипторы могут не утекать - просто кэшироваться. Если вы измените свою тестовую программу так, чтобы она загружала и выгружала вашу DLL несколько раз, увидите ли вы, что при каждой выгрузке DLL происходит утечка новой пары хэндлов? Если нет, то это не проблема.

0
ответ дан 2 September 2019 в 23:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: