Главная страница
    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.48 MB
Время: 0.034 c
1-1083757608
DimonNew
2004-05-05 15:46
2004.05.23
ini файл


1-1084342715
AngelSAI
2004-05-12 10:18
2004.05.23
Вывод вертикального текста


11-1071528845
f3n
2003-12-16 01:54
2004.05.23
аналог VCL::TDrawGrid


1-1084267650
Andrey79
2004-05-11 13:27
2004.05.23
Шрифт для Code Editor


14-1083244571
Undert
2004-04-29 17:16
2004.05.23
Internet Traffic Quota Software





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский