MSVS C ++: как найти адрес чисто виртуальной функции во время выполнения - PullRequest
0 голосов
/ 11 февраля 2020

Я пишу 64-битную Windows DLL-библиотеку, используя MSVS, которая загружается сторонним исполняемым файлом. Сторонний exe имеет API, который включает в себя некоторые классы с чисто виртуальными функциями. Пример:

//3rdPartyAPI.h
class foo
{
    virtual void doWork() = 0;
};
 __declspec(dllimport) foo* GetFOO(); //returns an instance of foo created by the executable that I can access

Как только моя DLL загружена, я могу вызвать doWork из своего собственного кода следующим образом:

GetFOO()->doWork(); 

Однако я хочу использовать библиотеку обходов Microsoft для перехвата вызовов doWork и вызвать мою собственную функцию "doMyWork". Пока что, вручную пройдя виртуальную таблицу «foo» во время выполнения, я смог найти индекс виртуальной таблицы doWork (методом проб и ошибок), а затем оттуда я могу получить его адрес и использовать этот адрес в вызове. в DetourAttach и объезд работает как задумано.

Но я хотел бы знать: есть ли способ программно (во время выполнения) найти индекс / адрес vtable чистой виртуальной функции?

...