Доброго времени суток.
Есть у меня midl файл с описанием интерфейсов, перед каждым методом стоит ид, но вот проблема в том, что некоторые ид идут не по порядку, например
и т.п. Вопрос мой в следующем — при при расчете смещения относительно указателя, который я получу у QueryInterface, нужно ли руководствоваться этим id, или он предназначен исключительно для IDispatch?
Здравствуйте, zxcvb, Вы писали:
Z>Есть у меня midl файл с описанием интерфейсов, перед каждым методом стоит ид, но вот проблема в том, что некоторые ид идут не по порядку, например
Z>и т.п. Вопрос мой в следующем — при при расчете смещения относительно указателя, который я получу у QueryInterface, нужно ли руководствоваться этим id, или он предназначен исключительно для IDispatch?
Этот id предназначен даже не для IDispatch, а для ITypeInfo. Хотя, имея id и ITypeInfo, можно получить смещение в таблице виртуальных функций, если интерфейс имеет эту таблицу. В противном случае для этих методов нет "смещения относительно указателя".
Здравствуйте, Vi2, Вы писали:
Vi2>Этот id предназначен даже не для IDispatch, а для ITypeInfo. Хотя, имея id и ITypeInfo, можно получить смещение в таблице виртуальных функций, если интерфейс имеет эту таблицу. В противном случае для этих методов нет "смещения относительно указателя".
Спасибо за ответ.
Почитал про ITypeInfo и всетаки остался непонятный момент. Предположим что интерфейс имеет таблицу виртуальных функций, и у меня есть тот набор данных что я описал в первом посте, могу ли я с этой таблицей работать просто как с массивом указателей, или я должен обязательно вычислять адресс метода в ней при помощи id и ITypeInfo::AddressOfMember. MSDN почему-то этот момент туманно описывает. Тоесть верно ли мое утверждение о том, что указатели в таблице будут идти строго друг за другом в том же порядке, который указан в midl файле?
Здравствуйте, zxcvb, Вы писали:
Z>Почитал про ITypeInfo и всетаки остался непонятный момент. Предположим что интерфейс имеет таблицу виртуальных функций, и у меня есть тот набор данных что я описал в первом посте, могу ли я с этой таблицей работать просто как с массивом указателей, или я должен обязательно вычислять адресс метода в ней при помощи id и ITypeInfo::AddressOfMember. MSDN почему-то этот момент туманно описывает.
Честно говоря, я не уверен, что ITypeInfo::AddressOfMember вернет что-то осмысленное для виртуальных функций. Хотя кто знает...
Z>То есть верно ли мое утверждение о том, что указатели в таблице будут идти строго друг за другом в том же порядке, который указан в midl файле?
Это утверждение верно, потому что виртуальная таблица формируется по такой же стратегией, что и компилятор С++ при обработке класса с виртуальными функциями.
PS
У ITypeInfo есть метод Invoke, который умеет вызывать виртуальные функции. Может и не стоит заморачиваться со смещениями?
Здравствуйте, Vi2, Вы писали:
Vi2>Честно говоря, я не уверен, что ITypeInfo::AddressOfMember вернет что-то осмысленное для виртуальных функций. Хотя кто знает...
Не понял понял этот момент, имеется ввиду виртуальные в терминах с++, например, тоесть те которые должны быть реализованы теми кто это класс унаследует?
Имеется ли в виду то, что ITypeInfo::AddressOfMember вернет невменяемый указатель, но Invoke вызовет метод корректно? Механизм этот мне совсем неясен.
Vi2>PS Vi2>У ITypeInfo есть метод Invoke, который умеет вызывать виртуальные функции. Может и не стоит заморачиваться со смещениями?
Этот момент я рассматривал, но с указателем на функцию все же проще работать, для Invoke надо аргументы подготовить, и указатель на то что вернется, в общем я решил им пользоваться от безысходности.
Здравствуйте, zxcvb, Вы писали:
Z>Не понял понял этот момент, имеется ввиду виртуальные в терминах с++, например, то есть те которые должны быть реализованы теми кто это класс унаследует? Имеется ли в виду то, что ITypeInfo::AddressOfMember вернет невменяемый указатель, но Invoke вызовет метод корректно? Механизм этот мне совсем неясен.
ITypeInfo::AddressOfMember, скорее всего, вернет адрес функции или переменной, объявленных в ДЛЛ как обычно, т.е. GetProcAddress-подобный механизм. Я даже не могу представить, что можно вернуть для метода интерфейса, ведь ITypeInfo не имеет понятия о коде, реализующем сервер.
Z>Этот момент я рассматривал, но с указателем на функцию все же проще работать, для Invoke надо аргументы подготовить, и указатель на то что вернется, в общем я решил им пользоваться от безысходности.
Делегатор пишешь? Здесь на сайте, вроде, была информация по этому поводу.
Здравствуйте, Vi2, Вы писали:
Vi2>ITypeInfo::AddressOfMember, скорее всего, вернет адрес функции или переменной, объявленных в ДЛЛ как обычно, т.е. GetProcAddress-подобный механизм. Я даже не могу представить, что можно вернуть для метода интерфейса, ведь ITypeInfo не имеет понятия о коде, реализующем сервер.
Ну теперь причины примерно ясны, спасибо, по крайней мере ясно куда дальше смотреть.
Vi2>Делегатор пишешь? Здесь на сайте, вроде, была информация по этому поводу.
Нет не делегатор, просто надо работать с com сервером из не майкросовтовского окружения, а именно из лиспа, доступны мне из него только вызов сишных функций и работа с сишными объектами.
Здравствуйте, zxcvb, Вы писали:
Z>Нет не делегатор, просто надо работать с com сервером из не майкросовтовского окружения, а именно из лиспа, доступны мне из него только вызов сишных функций и работа с сишными объектами.
Ну тогда через ITypeInfo интерфейса и указатель на его виртуальную таблицу, т.е. сам указатель на интерфейс, можно получить адрес метода, имеющего этот id. FUNCDESC структура тебе поможет в этом определении.