Как получить имя функции по адресу функции, читая таблицу co-classs'es vtable? - PullRequest
0 голосов
/ 12 марта 2010

Мне нужно вызвать функцию совместного класса, прочитав ее адрес из таблицы методов интерфейса COM. Мне нужен какой-то общий способ чтения адресов.

Теперь мне нужно вызвать функцию, которая будет иметь конкретные адреса (НЕ ИЗВЕСТНЫЕ) аргументы (параметры), которые я собрал из TLB, а также имя. Как этот адрес соответствует имени той функции, к которой я собираюсь позвонить.

Для этого мне нужно пройти через vtable, который содержит функциональные адреса, ПОСЛЕДНИМ образом нужно сопоставить адрес функции с ИМЯ этой функции. Это я не знаю. Как? В vtable может появиться более одной функции с одинаковым именем (случай перегрузки). В этом случае нам нужно различать имена функций по их адресам. Как справиться? С уважением Усман


С уважением, сэр. !!

Я разрабатываю инфраструктуру модульного тестирования, для которой мне нужно вытащить все сигнатуры функций определенного COM Exe или COM DLL для отображения в сетке или любом другом интерфейсе для пользователя, чтобы позже, выбрав определенную сигнатуру функции из этого списка, Он / она может выполнить эту функцию после предоставления аргументов (данных в качестве параметров) этой функции. Все это будет выполняться динамически во время выполнения, во время выполнения функция будет вызываться по желанию пользователя.

Это может быть достигнуто различными способами.

Предоставляя TLB (библиотеки типов), мы можем получить каждую сигнатуру функции и показать каждую сигнатуру элементу управления Grid или элементу управления Tree. Второй шаг - вызвать эти функции во время выполнения, предоставив данные. Для вызова требуются данные и адрес функций (или имен). Я хотел бы иметь некоторую панель графического интерфейса или элемент управления, который будет принимать данные от пользователя, и эти данные затем станут аргументами.

Теперь возникает реальная проблема, о которой я писал ранее. Вызов функций / методов этого интерфейса, предоставляемых COM-компонентом, реализованным совместно классом. Для этого необходимо отследить vtable интерфейса, предоставляемого компонентом, найти адрес этой функции, а затем узнать, действительно ли это адрес, на который я собираюсь звонить, как функция? Таким образом, для этого требуется преобразовать этот адрес в имя функции, а затем при сравнении некоторые сравнения строк определят, действительно ли это было то имя функции, которое пользователь щелкнул в Tree Control, показывая подписи.

Предложения или рекомендации?

1 Ответ

0 голосов
/ 12 марта 2010

Вызов ITypeInfo :: GetFuncDesc для каждой функции и возвращаемой структуры FUNCDESC содержит индекс vtable в члене oVft. Приведите интерфейс vtable к void ** и просто используйте его в качестве индекса.

Конечно, вполне понятно, зачем вам это делать, я не знаю :)

...