Почему фреймворки хранят свой собственный HMODULE, когда его можно получить с помощью __ImageBase или GetModuleHandleEx ()? - PullRequest
2 голосов
/ 21 февраля 2012

Этот вопрос спрашивает, как получить дескриптор библиотеки DLL, которая содержит исполняемый в данный момент код. Ссылка в одном из ответов предполагает использование адреса __ImageBase в качестве дескриптора модуля. Это работает для меня.

У меня такой вопрос: учитывая, что получить дескриптор текущего модуля так удивительно просто, почему фреймворки, такие как MFC (и даже база кода, которую я унаследовал), обычно хранят дескриптор экземпляра, переданный в DllMain(), в некоторой глобальной переменной? Есть ли причина не полагаться на __ImageBase?

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

1 Ответ

6 голосов
/ 21 февраля 2012

__ImageBase - это трюк, предоставляемый Microsoft linker , и может не работать с другими компиляторами / компоновщиками. Даже если фреймворк не поддерживает другие наборы инструментов, они могут не знать об этом магическом символе, поэтому, возможно, поэтому он и не используется.

То же самое можно сделать в чистом WinAPI с VirtualQuery или GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...