2016-04-23 2 views
0

У меня есть указатель на COM-объект pfoo реализует IFoo. Я хотел бы получить адрес pfoo-> Bar(), один из методов IFoo. Поскольку объекты COM хорошо документированы, это должно быть довольно легко. И на самом деле. Если Bar() есть, скажем, пятый метод в интерфейсе (учет, конечно, для методов IUnknown), адрес может быть извлечен из виртуальные таблицы сКак я могу получить адрес функции-члена COM-объекта?

(*(void***)(pfoo))[5] 

мой вопрос, есть ли способ сделать это без необходимости использовать «5»? Похоже, что ошибки должны подсчитывать методы. Я хочу использовать только имя метода. Я не возражаю, если это немного сложно; все равно все идет в макрос. Итак, мой последний вопрос: существует ли макрос, который принимает параметры pfoo, Bar и, возможно, IFoo, и оценивает выражение выше?

+1

Может ли быть так, что вы действительно хотите реализовать IDispatch? –

+0

C++, похоже, не хочет, чтобы вы фиксировали указатель на функцию-член из экземпляра класса. Вы должны иметь доступ к классу, который реализует IFoo, тогда вы можете сказать 'auto pBar = & CFoo :: Bar;'. Учитывая, что он не примет '& pFoo-> Bar', нет возможности построить макрос, который не принимает порядковый номер метода. –

ответ

0

Нет, для этого нет макроса. Это ваши похороны, если вы хотите это сделать.

Просто не забывайте, что если ваш интерфейс получен из IUnknown, то 5-я функция не является 5-й функцией в интерфейсе, а 8-й, поскольку перед первым методом в интерфейсе есть QueryInterface, AddRef и Release --Необязательно в этом порядке. Если вы получены из IDispatch, перед вашим первым методом еще больше методов.

Если вы посмотрите исходный код MFC, они используют некоторые макросы для выполнения некоторых подобных действий в своем макросе METHOD_PROLOGUE(). Он использует либо макрокоманду, либо компилятор MS под названием «offsetof()». Я не знаю, что это такое, и я не склонен его искать, но поскольку MS предоставляет исходный код, вы должны это сделать.

Редактировать: Я просто искал его, и кажется, что offsetof() является макросом stddef.h. https://en.wikipedia.org/wiki/Offsetof

Смежные вопросы