id и смещение в idl файле.
От: zxcvb  
Дата: 08.02.10 08:18
Оценка:
Доброго времени суток.
Есть у меня midl файл с описанием интерфейсов, перед каждым методом стоит ид, но вот проблема в том, что некоторые ид идут не по порядку, например
[id(0x0000000a)]
            HRESULT UpdatePosition(...
[id(0x00000014)]
            HRESULT AddSymbol(....

и т.п. Вопрос мой в следующем — при при расчете смещения относительно указателя, который я получу у QueryInterface, нужно ли руководствоваться этим id, или он предназначен исключительно для IDispatch?
Re: id и смещение в idl файле.
От: Vi2 Удмуртия http://www.adem.ru
Дата: 08.02.10 09:15
Оценка:
Здравствуйте, zxcvb, Вы писали:

Z>Есть у меня midl файл с описанием интерфейсов, перед каждым методом стоит ид, но вот проблема в том, что некоторые ид идут не по порядку, например

Z>[id(0x0000000a)]
Z>            HRESULT UpdatePosition(...
Z>[id(0x00000014)]
Z>            HRESULT AddSymbol(....

Z>и т.п. Вопрос мой в следующем — при при расчете смещения относительно указателя, который я получу у QueryInterface, нужно ли руководствоваться этим id, или он предназначен исключительно для IDispatch?

Этот id предназначен даже не для IDispatch, а для ITypeInfo. Хотя, имея id и ITypeInfo, можно получить смещение в таблице виртуальных функций, если интерфейс имеет эту таблицу. В противном случае для этих методов нет "смещения относительно указателя".
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: id и смещение в idl файле.
От: zxcvb  
Дата: 08.02.10 12:00
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Этот id предназначен даже не для IDispatch, а для ITypeInfo. Хотя, имея id и ITypeInfo, можно получить смещение в таблице виртуальных функций, если интерфейс имеет эту таблицу. В противном случае для этих методов нет "смещения относительно указателя".


Спасибо за ответ.
Почитал про ITypeInfo и всетаки остался непонятный момент. Предположим что интерфейс имеет таблицу виртуальных функций, и у меня есть тот набор данных что я описал в первом посте, могу ли я с этой таблицей работать просто как с массивом указателей, или я должен обязательно вычислять адресс метода в ней при помощи id и ITypeInfo::AddressOfMember. MSDN почему-то этот момент туманно описывает. Тоесть верно ли мое утверждение о том, что указатели в таблице будут идти строго друг за другом в том же порядке, который указан в midl файле?
Re[3]: id и смещение в idl файле.
От: Vi2 Удмуртия http://www.adem.ru
Дата: 08.02.10 12:31
Оценка:
Здравствуйте, zxcvb, Вы писали:

Z>Почитал про ITypeInfo и всетаки остался непонятный момент. Предположим что интерфейс имеет таблицу виртуальных функций, и у меня есть тот набор данных что я описал в первом посте, могу ли я с этой таблицей работать просто как с массивом указателей, или я должен обязательно вычислять адресс метода в ней при помощи id и ITypeInfo::AddressOfMember. MSDN почему-то этот момент туманно описывает.


Честно говоря, я не уверен, что ITypeInfo::AddressOfMember вернет что-то осмысленное для виртуальных функций. Хотя кто знает...

Z>То есть верно ли мое утверждение о том, что указатели в таблице будут идти строго друг за другом в том же порядке, который указан в midl файле?


Это утверждение верно, потому что виртуальная таблица формируется по такой же стратегией, что и компилятор С++ при обработке класса с виртуальными функциями.

PS
У ITypeInfo есть метод Invoke, который умеет вызывать виртуальные функции. Может и не стоит заморачиваться со смещениями?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: id и смещение в idl файле.
От: zxcvb  
Дата: 08.02.10 13:04
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Честно говоря, я не уверен, что ITypeInfo::AddressOfMember вернет что-то осмысленное для виртуальных функций. Хотя кто знает...


Не понял понял этот момент, имеется ввиду виртуальные в терминах с++, например, тоесть те которые должны быть реализованы теми кто это класс унаследует?
Имеется ли в виду то, что ITypeInfo::AddressOfMember вернет невменяемый указатель, но Invoke вызовет метод корректно? Механизм этот мне совсем неясен.

Vi2>PS

Vi2>У ITypeInfo есть метод Invoke, который умеет вызывать виртуальные функции. Может и не стоит заморачиваться со смещениями?

Этот момент я рассматривал, но с указателем на функцию все же проще работать, для Invoke надо аргументы подготовить, и указатель на то что вернется, в общем я решил им пользоваться от безысходности.
Re[5]: id и смещение в idl файле.
От: Vi2 Удмуртия http://www.adem.ru
Дата: 08.02.10 14:12
Оценка:
Здравствуйте, zxcvb, Вы писали:

Z>Не понял понял этот момент, имеется ввиду виртуальные в терминах с++, например, то есть те которые должны быть реализованы теми кто это класс унаследует? Имеется ли в виду то, что ITypeInfo::AddressOfMember вернет невменяемый указатель, но Invoke вызовет метод корректно? Механизм этот мне совсем неясен.


ITypeInfo::AddressOfMember, скорее всего, вернет адрес функции или переменной, объявленных в ДЛЛ как обычно, т.е. GetProcAddress-подобный механизм. Я даже не могу представить, что можно вернуть для метода интерфейса, ведь ITypeInfo не имеет понятия о коде, реализующем сервер.

Z>Этот момент я рассматривал, но с указателем на функцию все же проще работать, для Invoke надо аргументы подготовить, и указатель на то что вернется, в общем я решил им пользоваться от безысходности.


Делегатор пишешь? Здесь на сайте, вроде, была информация по этому поводу.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[6]: id и смещение в idl файле.
От: zxcvb  
Дата: 08.02.10 15:56
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>ITypeInfo::AddressOfMember, скорее всего, вернет адрес функции или переменной, объявленных в ДЛЛ как обычно, т.е. GetProcAddress-подобный механизм. Я даже не могу представить, что можно вернуть для метода интерфейса, ведь ITypeInfo не имеет понятия о коде, реализующем сервер.


Ну теперь причины примерно ясны, спасибо, по крайней мере ясно куда дальше смотреть.

Vi2>Делегатор пишешь? Здесь на сайте, вроде, была информация по этому поводу.


Нет не делегатор, просто надо работать с com сервером из не майкросовтовского окружения, а именно из лиспа, доступны мне из него только вызов сишных функций и работа с сишными объектами.
Re[7]: id и смещение в idl файле.
От: Vi2 Удмуртия http://www.adem.ru
Дата: 08.02.10 16:31
Оценка:
Здравствуйте, zxcvb, Вы писали:

Z>Нет не делегатор, просто надо работать с com сервером из не майкросовтовского окружения, а именно из лиспа, доступны мне из него только вызов сишных функций и работа с сишными объектами.


Ну тогда через ITypeInfo интерфейса и указатель на его виртуальную таблицу, т.е. сам указатель на интерфейс, можно получить адрес метода, имеющего этот id. FUNCDESC структура тебе поможет в этом определении.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.