Этот вопрос спрашивает, как получить дескриптор библиотеки DLL, которая содержит исполняемый в данный момент код. Ссылка в одном из ответов предполагает использование адреса __ImageBase
в качестве дескриптора модуля. Это работает для меня.
У меня такой вопрос: учитывая, что получить дескриптор текущего модуля так удивительно просто, почему фреймворки, такие как MFC (и даже база кода, которую я унаследовал), обычно хранят дескриптор экземпляра, переданный в DllMain()
, в некоторой глобальной переменной? Есть ли причина не полагаться на __ImageBase
?
Редактировать : Согласно Раймонд Чен , __ImageBase
только для компоновщиков Microsoft. Существует другой вопрос , в котором есть более точные ответы, включая независимый от линкера способ использования GetModuleHandleEx()
. Существует также решение для Win2000 и более ранних версий, использующее VirtualQuery()
. Вопрос остается в силе: зачем сохранять базовый адрес, если его легко восстановить?