У меня есть указатель на некоторый объект, который был загружен из DLL с помощью GetProcAddress:
CSomeClass* pSomeClass;
pSomeClass = (CSomeClass*)GetProcAddress(someDLLinstance, "SomeUnknownName");
Я не могу изменить код выше, но мне нужно получить "SomeUnknownName"
строка после того, как он вышел из области видимости. Все, что я могу получить, это pSomeClass
указатель. Есть ли какой-нибудь удобный способ получить имя импортированного объекта из его указателя? Прямо сейчас я просто сбрасываю все имена экспорта из DLL, затем использую GetProcAddress()
на каждом из них получить все указатели на все экспортируемые объекты / функции, а затем сравнить pSomeClass
к этим указателям, но это, кажется, очень медленно для решения.
Если вам действительно нужно это сделать, вы можете использовать функции DbgHelp для выполнения этой работы. В частности, вы бы смотрели на SymFromAddr
в этом случае.
Вы начинаете с вызова SymInitialize
тогда вы можете позвонить SymFromAddr
, Вы даете ему адрес структуры SYMBOL_INFO. Вы вводите адрес и максимальную длину символа, и он возвращает имя.
Когда вы закончите, вы по крайней мере должны позвонить SymCleanup
позволить библиотеке диспетчера символов завершить работу, освободить любую память, которую она хранит, и т. д. Предположительно, это произойдет / все произойдет, когда ваш процесс завершится, но чистее будет вызывать его, когда вы закончите.
Если у вас есть отладочная информация, это будет успешно для любого символа. Однако даже без отладочной информации он (по крайней мере обычно) будет успешным для экспортированных символов.