Мне удалось привязать все, что я хотел (функции API, виртуальные методы, "стандартные" функции), но мне интересно, как подключить функцию (метод), не являющуюся виртуальным классом. Чтобы подключить виртуальный метод, вам просто нужно получить VTable и исправить его (или скопировать, изменить и изменить VPointer). Однако, когда метод НЕ является виртуальным, VTable не существует.
Прежде всего, как я могу получить адрес метода, который я хочу связать с его именем? Я не могу использовать GetProcAddress()
поскольку функция не экспортируется. Кажется, что единственный способ поиска байтового шаблона в памяти, соответствующей функции. Затем, как только я получил адрес, как мне его перехватить? Использование базового метода (JMP)? Что делать, если я хочу подключить только один экземпляр? Я думаю, что я проверю свою функцию подключения: если это правильный экземпляр, тогда сделайте то, что нужно сделать, иначе просто выполните его, не делая ничего другого.
На самом деле я ищу лучшие решения, потому что думаю, что те, что были выше, будут работать, но они не очень "опрятные", не так ли?
Спасибо.
В большинстве случаев просто невозможно отменить статически разрешенную функцию. Вы когда-нибудь слышали об этой оптимизации, называемой inlining? Даже когда этого не происходит, COMDAT-фальцовка может сделать выделение вашей интересующей функции совершенно невозможной.
Настоятельно рекомендуется читать: Раймонд Чен: "Почему отладчик показывает мне неправильную функцию?"
WinAPI
но вы можете взять адрес функции-члена, используя синтаксис&ClassName::member_name
.ClassName
не является частью библиотеки, которую я могу#include
в моей DLL (которую я хочу добавить), но вместо этого это класс, определенный в программе, которую я хочу подключить: я не могу написать&ClassName:member_name
в моей DLL, я получу ошибку компиляции.