Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.024 c
1-1083844792
Akni
2004-05-06 15:59
2004.05.23
Использование Delphi-DLL в VB


1-1084333644
WinLamka
2004-05-12 07:47
2004.05.23
Динамическая структура.


3-1083242996
BPK
2004-04-29 16:49
2004.05.23
Сложный динамический SQL-запрос


1-1083740361
Term
2004-05-05 10:59
2004.05.23
Можно ли сделать форму активной если известен её caption?


3-1083127093
Lamo_xxxx
2004-04-28 08:38
2004.05.23
Как перейти к следующе из найденных по какому-либо условию записи