Текущий архив: 2004.05.23;
Скачать: CL | DM;
ВнизРеально ли вытащить из COM объекта его методы? Найти похожие ветки
← →
vic_vm (2004-05-04 23:11) [0]Есть чужая dll, которая является inproс COM сервером. Не известно сколько она реализует интерфейсов и какие. Можно ли из нее вытащить описание этих интерфейсов и их методов? В какую сторону копать и чем пользоваться?
← →
default © (2004-05-04 23:13) [1]наверно, в сторону библиотеки типов надо копать
точно не скажу сам про это ещё не дочитал
← →
Игорь Шевченко © (2004-05-04 23:15) [2]OleView не поможет ?
← →
vic_vm (2004-05-04 23:45) [3]Библиотеки типов нет. Вот в том то и проблемма что интерфейс не документирован...
OleView тут ничем не поможет
← →
Игорь Шевченко © (2004-05-04 23:54) [4]На RSDN.RU есть статья Павла Блудова "Known IUnknown"
← →
vic_vm (2004-05-05 00:20) [5]2Игорь Шевченко
За статью спасибо...
Но проблемма в том что нет соответствующего .pdb файла
для исследуемой библиотеки.
В принципе как найти сам интерфейс я знаю. Тут вопрос чтобы добраться до VMT этого интерфейса и вытащить из нее названия методов.
А вот для этого знаний у меня маловато
← →
sniknik © (2004-05-05 00:42) [6]не поможет?
project-import type library-add (твоя dll)
и если вдруг это от 1С, по их правилам сделаная, то это не поможет в любом случае (там от нормальной реализации COM осталось с пяток методов через которые вызываются остальные, естественно формально они не описаны (для любой вернет эти пять))
← →
Fantasist © (2004-05-05 02:01) [7]
> и вытащить из нее названия методов.
Названия методов интерфейса в коде не присутсвуют и присутсвовать там не могут. Для названий должно быть хоть что-то, что описывает этот COM объект. Кстати, библиотека типов обычно зашита в виде ресурса в dll.
> project-import type library-add (твоя dll)
Это поможет, если библиотека типов все-таки есть. Если же действительно нет, то не поможет.
← →
vic_vm (2004-05-05 11:54) [8]Народ, кто может меня просветить - что физически представляет из себя таблица VMT, где про это можно почитать?
← →
DiamondShark © (2004-05-05 11:59) [9]
> Народ, кто может меня просветить - что физически представляет
> из себя таблица VMT
Массив DWORD
← →
Ломброзо © (2004-05-05 12:06) [10]IUnknown->IDispatch->GetTypeInfo->ITypeInfo, а уж из него - всё остальное (GetNames, GetFuncDesc и пр)
← →
DiamondShark © (2004-05-05 12:09) [11]
> Ломброзо © (05.05.04 12:06) [10]
Это если шибко повезёт. А то как вернёт GetTypeInfo E_NOTIMPL...
И усё, сливай васер.
← →
wal © (2004-05-05 12:12) [12]
> IUnknown->IDispatch->GetTypeInfo->ITypeInfo
Cовсем не факт, что IDispatch в компоненте реализован. Единственное, что можно сказать с уверенностью, это только IUnknown.
С уважением.
← →
vic_vm (2004-05-05 20:50) [13]2DiamondShark
>Массив DWORD
Хорошо, а как же тогда осуществляется поиск методов объекта?
Чесно сказать я думал что как-то по имени..
← →
Fantasist © (2004-05-05 22:57) [14]
> Хорошо, а как же тогда осуществляется поиск методов объекта?
По смещению. COM - бинарный стандарт, то есть совместимость идет на бинарном уровне. Соответсвенно смещение до адреса необходимого метода в интерфейсе строго определенно порядком его объявления. Допустим, если есть указатель на IUnknown, то по адресу этого указателя будет лежать указатель на таблицу адресов методов. Эта таблица - массив четырехбайтовых значений (указателей на методы). Первым элемнтом этого массива будет адрес QueryInterface, вторым AddRef, третьим Release.
> Чесно сказать я думал что как-то по имени..
Есть интерфейс IDispatch, который реализует вызов метода по имени. Он может быть реализован вручную, а может с использованием интерфейсов библиотеки типов. Естесственно, вызов по имени значительно дольше.
← →
vic_vm (2004-05-06 12:29) [15]>Соответсвенно смещение до адреса необходимого метода
>в интерфейсе строго определенно порядком его объявления.
Т.е. мне нужно знать даже не названия методов, а просто их количество и какой метод где вызывать (конечно и с какими параметрами)?
Получается если у кого-то есть интерфейс
IKakojto = interface(IUnknown)
["{0.................................0}"]
function Some1(): HResult; stdcall;
function Some2(Param1 : DWORD): HResult; stdcall;
function Some3(Param1 : DWORD; var Param2 : DWORD): HResult; stdcall;
end;
то я могу в заголовочном файле объявить (с тем же GUID)
IMy = interface(IUnknown)
["{0.................................0}"]
function Do1(): HResult; stdcall;
function Do2(Param1 : DWORD): HResult; stdcall;
function Do3(Param1 : DWORD; var Param2 : DWORD): HResult; stdcall;
end;
и смело вызывать методы Do1, Do2, Do3?
Главное знать их входные параметры?
← →
Fantasist © (2004-05-06 22:19) [16]
> vic_vm (06.05.04 12:29) [15]
Именно так.
Страницы: 1 вся ветка
Текущий архив: 2004.05.23;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.034 c