Имеется COM-сервер, оформленный в виде Dll и устновленный в системе. Хочется его заюзать из другй (самодельной) аппликации.
Вопрос, как это можно осуществить? Т.е., я догадываюсь, что надо узнать сигнатуры методов его интерфейсов, но вот не догадываюсь, как это можно сделать. На память приходит какая-то утилитка, виденная мною 155 лет назад, которая показывала экспортируемые ф-ии. Но это было давно и неправда — т.е., я может, чего напутал или слишком усложняю.
В общем, help, please и, соответственно, thanks in advance.
Здравствуйте, Аноним, Вы писали:
А>Возможно, тупой вопрос — заранее прошу прощения.
А>Имеется COM-сервер, оформленный в виде Dll и устновленный в системе. Хочется его заюзать из другй (самодельной) аппликации. А>Вопрос, как это можно осуществить? Т.е., я догадываюсь, что надо узнать сигнатуры методов его интерфейсов, но вот не догадываюсь, как это можно сделать. На память приходит какая-то утилитка, виденная мною 155 лет назад, которая показывала экспортируемые ф-ии. Но это было давно и неправда — т.е., я может, чего напутал или слишком усложняю.
Если в режиме выполнения, то запрашиваешь IProvideClassInfo::GetClassInfo и дальше через все через ITypeInfo.
Или в OleView простотреть библиотеку типов, получить IDL, откомпилировать и использовать .h
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, Аноним, Вы писали:
А>Возможно, тупой вопрос — заранее прошу прощения.
А>Имеется COM-сервер, оформленный в виде Dll и устновленный в системе. Хочется его заюзать из другй (самодельной) аппликации. А>Вопрос, как это можно осуществить? Т.е., я догадываюсь, что надо узнать сигнатуры методов его интерфейсов, но вот не догадываюсь, как это можно сделать. На память приходит какая-то утилитка,
А>Имеется COM-сервер, оформленный в виде Dll и устновленный в системе. Хочется его заюзать из другй (самодельной) аппликации.
А>Вопрос, как это можно осуществить? Т.е., я догадываюсь, что надо узнать сигнатуры методов его интерфейсов, но вот не догадываюсь, как это можно сделать. На память приходит какая-то утилитка, виденная мною 155 лет назад, которая показывала экспортируемые ф-ии. Но это было давно и неправда — т.е., я может, чего напутал или слишком усложняю.
А по-моему, директива #import <эта.DLL> <ключи> поможет узнать сигнатуру и все интерфейсы и т.п.
Здравствуйте, TK, Вы писали:
TK>Или в OleView простотреть библиотеку типов, получить IDL, откомпилировать и использовать .h
Вот тут, можно чуть подробнее — в OleView искать по имени Dll-я, или еще как? И как дальше "откомпилировать и использовать .h" — хотя бы в двух словах?
Здравствуйте, Аноним, Вы писали:
А>Данке зер всем, кто ответил... ;)
TK>>Или в OleView простотреть библиотеку типов, получить IDL, откомпилировать и использовать .h
А>Вот тут, можно чуть подробнее — в OleView искать по имени Dll-я, или еще как? И как дальше "откомпилировать и использовать .h" — хотя бы в двух словах?
Vi2 уже предложил использовать директиву #import — это один из самых простых способов.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, Аноним, Вы писали:
А>Данке зер всем, кто ответил... ;)
TK>>Или в OleView простотреть библиотеку типов, получить IDL, откомпилировать и использовать .h
А>Вот тут, можно чуть подробнее — в OleView искать по имени Dll-я, или еще как? И как дальше "откомпилировать и использовать .h" — хотя бы в двух словах?
В OleView нужно открыть файл с библиотекой типов для этого класса.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, Vi2, Вы писали:
Vi2>А по-моему, директива #import <эта.DLL> <ключи> поможет узнать сигнатуру и все интерфейсы и т.п.
Кроме того, она генерит набор враппер классов, при использовании которых прога выглядит так же просто как и на VB. Не нужно никаких QueryInterface, AddRef, Release, и т.д. В общем, могучая штука.
GR>Кроме того, она генерит набор враппер классов, при использовании которых прога выглядит так же просто как и на VB. Не нужно никаких QueryInterface, AddRef, Release, и т.д. В общем, могучая штука.
Не такая уж она могучая. [module] объявления не показывает. Но вроде в 7 должны исправить. Что-то еще не правильно отображает. Короче, морока еще та, но лучше только VB с его "Ссылками", да .Нет с его Рефлексией.
Здравствуйте, Vi2, Вы писали:
Vi2>Не такая уж она могучая.
C++ со своей директивой #import и .NET & Reflection находятся в "разных весовых категориях", так что дальнейший спор просто бесполезен. А VB был изначально заточен под использование COM. В с++ #import реально упрощает жизнь. Пользоваться "умными указателями" по любому приятней, чем возиться с обычными указателями на интерфесы. В этом и заключается та самая могучесть.
Vi2>А по-моему, директива #import <эта.DLL> <ключи> поможет узнать сигнатуру и все интерфейсы и т.п.
Огромная просьба, немоглибы Вы подробнее рассказать как дальше использовать методы этого СОМ? К примеру если я знаю какой то метод, что надо делать после директивы #import <some.DLL>?
Н>Огромная просьба, немоглибы Вы подробнее рассказать как дальше использовать методы этого СОМ? К примеру если я знаю какой то метод, что надо делать после директивы #import <some.DLL>?
Тема эта огромна и неисчерпаема, если поподробнее.
Есть Поиск на Форуме, Статьи на Сайте, например, Директива #import
Здравствуйте, Vi2, Вы писали:
Vi2>Тема эта огромна и неисчерпаема, если поподробнее. Vi2>Есть Поиск на Форуме, Статьи на Сайте, например, Директива #import
Спасибо за ссылку. Прочитал и уяснил, но возникла проблема с моим случаем.
Сделал так:
#import <C:\Program Files\2VG\Download Master\dmie.dll>
.....
void TestF()
{
DMIE::IMoveURL obj;//** тут ругается
obj.CreateInstance(L"DMIE.IMoveUrl");
ругается так:
error C2259: 'IMoveURL' : cannot instantiate abstract class due to following members:
c:\program files\microsoft visual studio\vc98\projects\dmbar\releaseminsize\dmie.tlh
Используй тэги форматирования для сообщения [ xxx ] внизу поля ввода текста!
Н>ругается так:
Н>error C2259: 'IMoveURL' : cannot instantiate abstract class due to following members:
Н>c:\program files\microsoft visual studio\vc98\projects\dmbar\releaseminsize\dmie.tlh
Н>[]
Н>что тут не так?
А что бы ему не ругаться! DMIE::IMoveURL означает, что ты создаешь переменную класса DMIE::IMoveURL. А это невозможно, так как это определение интерфейса.
Тогда уж DMIE::IMoveURL * obj.
А лучше, поскольку ты хочешь создавать объекты, пользоваться DMIE::IMoveURLPtr. Это Враппер-класс для интерфейса IMoveURL.
Скорее всего в CreateInstance была ошибка.
1. CoInitialize не был вызван. Если это MFC то нужно вызвать AfxOleInit() в CWinApp::InitInstance, если нет то CoInitialize.
2. ProgID не правильный.
void TestF()
{
DMIE::IMoveURLPtr obj;
HRESULT hr = obj.CreateInstance(L"DMIE.IMoveUrl");
if (SUCCEEDED(hr)) { // Здесь breakpoint.
obj->AddURL("","");
}
}
Если остановиться на breakpoint и добавить в Watch "hr,hr" то можно увидеть текстовую строку об ошибке.
Либо можно воспользоваться ::FormatMessage чтобы показать ошибку юзеру.
There are 10 types of people in the world, those who don't understand binaries, those who do, and those who understand not only binaries.
S>Скорее всего в CreateInstance была ошибка. S>1. CoInitialize не был вызван. Если это MFC то нужно вызвать AfxOleInit() в CWinApp::InitInstance, если нет то CoInitialize. S>2. ProgID не правильный.
S>
S>Если остановиться на breakpoint и добавить в Watch "hr,hr" то можно увидеть текстовую строку об ошибке. S>Либо можно воспользоваться ::FormatMessage чтобы показать ошибку юзеру.
Правильно говорит. Здесь нужно использовать или ProgID объекта (строка, под которой объект регистрирует себя в Реестре), или CLSID, который скорее всего есть в файле DMIE.tlh (поищи в этом файле слово "coclass", например,