Узнать методы COM-сервера?
От: Аноним  
Дата: 05.12.02 12:17
Оценка:
Возможно, тупой вопрос — заранее прошу прощения.

Имеется COM-сервер, оформленный в виде Dll и устновленный в системе. Хочется его заюзать из другй (самодельной) аппликации.
Вопрос, как это можно осуществить? Т.е., я догадываюсь, что надо узнать сигнатуры методов его интерфейсов, но вот не догадываюсь, как это можно сделать. На память приходит какая-то утилитка, виденная мною 155 лет назад, которая показывала экспортируемые ф-ии. Но это было давно и неправда — т.е., я может, чего напутал или слишком усложняю.

В общем, help, please и, соответственно, thanks in advance.
Re: Узнать методы COM-сервера?
От: TK Лес кывт.рф
Дата: 05.12.02 12:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Возможно, тупой вопрос — заранее прошу прощения.


А>Имеется COM-сервер, оформленный в виде Dll и устновленный в системе. Хочется его заюзать из другй (самодельной) аппликации.

А>Вопрос, как это можно осуществить? Т.е., я догадываюсь, что надо узнать сигнатуры методов его интерфейсов, но вот не догадываюсь, как это можно сделать. На память приходит какая-то утилитка, виденная мною 155 лет назад, которая показывала экспортируемые ф-ии. Но это было давно и неправда — т.е., я может, чего напутал или слишком усложняю.

Если в режиме выполнения, то запрашиваешь IProvideClassInfo::GetClassInfo и дальше через все через ITypeInfo.
Или в OleView простотреть библиотеку типов, получить IDL, откомпилировать и использовать .h
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: Узнать методы COM-сервера?
От: MikaRSDN Soukhov Stock#
Дата: 05.12.02 12:22
Оценка:
Здравствуйте, Аноним, Вы писали:

посмотри эти ключевые слова LoadTypeLib ITypeLib Может поможет
Re: Узнать методы COM-сервера?
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 05.12.02 12:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Возможно, тупой вопрос — заранее прошу прощения.


А>Имеется COM-сервер, оформленный в виде Dll и устновленный в системе. Хочется его заюзать из другй (самодельной) аппликации.

А>Вопрос, как это можно осуществить? Т.е., я догадываюсь, что надо узнать сигнатуры методов его интерфейсов, но вот не догадываюсь, как это можно сделать. На память приходит какая-то утилитка,

OleView.exe
Re: #import
От: Vi2 Удмуртия http://www.adem.ru
Дата: 05.12.02 12:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Имеется COM-сервер, оформленный в виде Dll и устновленный в системе. Хочется его заюзать из другй (самодельной) аппликации.
А>Вопрос, как это можно осуществить? Т.е., я догадываюсь, что надо узнать сигнатуры методов его интерфейсов, но вот не догадываюсь, как это можно сделать. На память приходит какая-то утилитка, виденная мною 155 лет назад, которая показывала экспортируемые ф-ии. Но это было давно и неправда — т.е., я может, чего напутал или слишком усложняю.

А по-моему, директива #import <эта.DLL> <ключи> поможет узнать сигнатуру и все интерфейсы и т.п.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Узнать методы COM-сервера?
От: Аноним  
Дата: 05.12.02 12:32
Оценка:
Данке зер всем, кто ответил...

Здравствуйте, TK, Вы писали:

TK>Или в OleView простотреть библиотеку типов, получить IDL, откомпилировать и использовать .h


Вот тут, можно чуть подробнее — в OleView искать по имени Dll-я, или еще как? И как дальше "откомпилировать и использовать .h" — хотя бы в двух словах?
Re[3]: Узнать методы COM-сервера?
От: TK Лес кывт.рф
Дата: 05.12.02 12:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Данке зер всем, кто ответил... ;)


TK>>Или в OleView простотреть библиотеку типов, получить IDL, откомпилировать и использовать .h


А>Вот тут, можно чуть подробнее — в OleView искать по имени Dll-я, или еще как? И как дальше "откомпилировать и использовать .h" — хотя бы в двух словах?


Vi2 уже предложил использовать директиву #import — это один из самых простых способов.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[3]: Узнать методы COM-сервера?
От: TK Лес кывт.рф
Дата: 05.12.02 12:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Данке зер всем, кто ответил... ;)


TK>>Или в OleView простотреть библиотеку типов, получить IDL, откомпилировать и использовать .h


А>Вот тут, можно чуть подробнее — в OleView искать по имени Dll-я, или еще как? И как дальше "откомпилировать и использовать .h" — хотя бы в двух словах?


В OleView нужно открыть файл с библиотекой типов для этого класса.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: #import
От: gloomy rocker Россия  
Дата: 05.12.02 12:36
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>А по-моему, директива #import <эта.DLL> <ключи> поможет узнать сигнатуру и все интерфейсы и т.п.


Кроме того, она генерит набор враппер классов, при использовании которых прога выглядит так же просто как и на VB. Не нужно никаких QueryInterface, AddRef, Release, и т.д. В общем, могучая штука.
Скука — двигатель прогресса.
Re[3]: #import
От: Vi2 Удмуртия http://www.adem.ru
Дата: 05.12.02 13:03
Оценка:
Здравствуйте, gloomy rocker, Вы писали:

GR>Кроме того, она генерит набор враппер классов, при использовании которых прога выглядит так же просто как и на VB. Не нужно никаких QueryInterface, AddRef, Release, и т.д. В общем, могучая штука.

Не такая уж она могучая. [module] объявления не показывает. Но вроде в 7 должны исправить. Что-то еще не правильно отображает. Короче, морока еще та, но лучше только VB с его "Ссылками", да .Нет с его Рефлексией.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: #import
От: gloomy rocker Россия  
Дата: 05.12.02 13:23
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Не такая уж она могучая.

C++ со своей директивой #import и .NET & Reflection находятся в "разных весовых категориях", так что дальнейший спор просто бесполезен. А VB был изначально заточен под использование COM. В с++ #import реально упрощает жизнь. Пользоваться "умными указателями" по любому приятней, чем возиться с обычными указателями на интерфесы. В этом и заключается та самая могучесть.
Скука — двигатель прогресса.
Re[2]: #import
От: Николай Украина http://www.nickolya.wallst.ru
Дата: 05.12.02 14:02
Оценка:
Здравствуйте, Vi2, Вы писали:


Vi2>А по-моему, директива #import <эта.DLL> <ключи> поможет узнать сигнатуру и все интерфейсы и т.п.


Огромная просьба, немоглибы Вы подробнее рассказать как дальше использовать методы этого СОМ? К примеру если я знаю какой то метод, что надо делать после директивы #import <some.DLL>?
Re[3]: #import
От: Vi2 Удмуртия http://www.adem.ru
Дата: 05.12.02 14:09
Оценка:
Здравствуйте, Николай, Вы писали:

Н>Огромная просьба, немоглибы Вы подробнее рассказать как дальше использовать методы этого СОМ? К примеру если я знаю какой то метод, что надо делать после директивы #import <some.DLL>?

Тема эта огромна и неисчерпаема, если поподробнее.
Есть Поиск на Форуме, Статьи на Сайте, например, Директива #import
Автор(ы): Игорь Ткачёв
Дата: 9.03.2001

В данной статье приводится объяснение работы директивы #import
компилятора Visual C++ и даны примеры её использования с
MS Word, MS Excel, ADO DB и ActiveX Control.
.
А после них, если есть вопросы, пожалуйста.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: #import
От: Николай Украина http://www.nickolya.wallst.ru
Дата: 05.12.02 15:09
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Тема эта огромна и неисчерпаема, если поподробнее.

Vi2>Есть Поиск на Форуме, Статьи на Сайте, например, Директива #import
Автор(ы): Игорь Ткачёв
Дата: 9.03.2001

В данной статье приводится объяснение работы директивы #import
компилятора Visual C++ и даны примеры её использования с
MS Word, MS Excel, ADO DB и ActiveX Control.
.

Vi2>А после них, если есть вопросы, пожалуйста.

Спасибо за ссылку. Прочитал и уяснил, но возникла проблема с моим случаем.
Сделал так:
#import <C:\Program Files\2VG\Download Master\dmie.dll>
.....
void TestF()
{
DMIE::IMoveURL obj;//** тут ругается
obj.CreateInstance(L"DMIE.IMoveUrl");

//SAMPLLib::ISamplObjectPtr obj2 = obj->Method(1l,L"12345");
obj->AddUrl("http://www.rsdn.ru/article/default.asp?com/introcom.xml
Автор(ы): Том Армстронг

В этой главе, позаимствованной из книги "ActiveX-Создание Web-приложений"
Тома Армстронга, рассматриваются основные понятия модели COM, такие как
интерфейс IUnknown, GUID, фабрики классов и т. д. Кроме того, автор приводит
примеры реализации COM-клиентов и COM-серверов с использованием языка C++,
Visual Basic и библиотеки ATL.
","http://www.rsdn.ru/");

}

ругается так:
error C2259: 'IMoveURL' : cannot instantiate abstract class due to following members:
c:\program files\microsoft visual studio\vc98\projects\dmbar\releaseminsize\dmie.tlh

dmie.tlh выглядит так:

#pragma once
#pragma pack(push, 8)

#include <comdef.h>

namespace DMIE {

//
// Forward references and typedefs
//

struct __declspec(uuid("6fc88142-1c6d-48fb-9592-2923cea45815"))
/* dual interface */ IMoveURL;
struct /* coclass */ MoveURL;

//
// Smart pointer typedef declarations
//

_COM_SMARTPTR_TYPEDEF(IMoveURL, __uuidof(IMoveURL));

//
// Type library items
//

struct __declspec(uuid("6fc88142-1c6d-48fb-9592-2923cea45815"))
IMoveURL : IDispatch
{
//
// Wrapper methods for error-handling
//

HRESULT AddURL (
_bstr_t strURL,
_bstr_t strREF );
HRESULT AddURLs (
VARIANT * tmpLinksArray,
_bstr_t tmpRef );

//
// Raw methods provided by interface
//

virtual HRESULT __stdcall raw_AddURL (
BSTR strURL,
BSTR strREF ) = 0;
virtual HRESULT __stdcall raw_AddURLs (
VARIANT * tmpLinksArray,
BSTR tmpRef ) = 0;
};

struct __declspec(uuid("c4533f02-1cef-4517-ab97-524cf90248ac"))
MoveURL;
// [ default ] interface IMoveURL

//
// Wrapper method implementations
//

#include "c:\program files\microsoft visual studio\vc98\projects\dmbar\releaseminsize\dmie.tli"

} // namespace DMIE

#pragma pack(pop)

что тут не так?
Re[5]: #import
От: Slamin США  
Дата: 05.12.02 15:13
Оценка:
Здравствуйте, Николай, Вы писали:

Н>Здравствуйте, Vi2, Вы писали:


Попробуйте так:

#import <C:\Program Files\2VG\Download Master\dmie.dll> named_guids
.....
void TestF()
{
    DMIE::IMoveURLPtr obj;//** тут ругается
    obj.CreateInstance(L"DMIE.IMoveUrl");
    // or obj.CreateInstance(DMIE::CLSID_MoveURL);

    //SAMPLLib::ISamplObjectPtr obj2 = obj->Method(1l,L"12345");
    obj->AddUrl("http://www.rsdn.ru/article/default.asp?com/introcom.xml","http://www.rsdn.ru/");
}
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.
Re[5]: DMIE::IMoveURLPtr
От: Vi2 Удмуртия http://www.adem.ru
Дата: 05.12.02 15:31
Оценка: 3 (1)
Здравствуйте, Николай, Вы писали:

Н>Спасибо за ссылку. Прочитал и уяснил, но возникла проблема с моим случаем.
Н>Сделал так:

Н>#import <C:\Program Files\2VG\Download Master\dmie.dll>
Н>.....
Н>void TestF()
Н>{
Н>    DMIE::IMoveURL obj;//** тут ругается
Н>    obj.CreateInstance(L"DMIE.IMoveUrl");

Н>    //SAMPLLib::ISamplObjectPtr obj2 = obj->Method(1l,L"12345");
Н>    obj->AddUrl("http://www.rsdn.ru/article/default.asp?com/introcom.xml","http://www.rsdn.ru/");
Н>}

Используй тэги форматирования для сообщения [ 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.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[6]: #import
От: Николай Украина http://www.nickolya.wallst.ru
Дата: 05.12.02 15:54
Оценка:
Здравствуйте, Slamin, Вы писали:

S>Здравствуйте, Николай, Вы писали:



S>Попробуйте так:


S>
S>#import <C:\Program Files\2VG\Download Master\dmie.dll> named_guids
S>.....
S>void TestF()
S>{
S>    DMIE::IMoveURLPtr obj;//** тут ругается
S>    obj.CreateInstance(L"DMIE.IMoveUrl");
S>    // or obj.CreateInstance(DMIE::CLSID_MoveURL);

S>    //SAMPLLib::ISamplObjectPtr obj2 = obj->Method(1l,L"12345");
S>    obj->AddUrl("http://www.rsdn.ru/article/default.asp?com/introcom.xml","http://www.rsdn.ru/");
S>}
S>


S>


Спасибо, получилось.
Теперь при вызове метода AddURL приложение вылетает.

void TestF()
{
    DMIE::IMoveURLPtr obj;
    obj.CreateInstance(L"DMIE.IMoveUrl");
    obj->AddURL("","");
    
}


что теперь может быть не так?
Re[7]: #import
От: Slamin США  
Дата: 05.12.02 16:07
Оценка:
Здравствуйте, Николай, Вы писали:

S>>Здравствуйте, Николай, Вы писали:

Н>Теперь при вызове метода AddURL приложение вылетает.

Н>
Н>void TestF()
Н>{
Н>    DMIE::IMoveURLPtr obj;
Н>    obj.CreateInstance(L"DMIE.IMoveUrl");
Н>    obj->AddURL("","");
Н>    
Н>}
Н>


Н>что теперь может быть не так?


Скорее всего в 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.
Re[8]: #import
От: Николай Украина http://www.nickolya.wallst.ru
Дата: 05.12.02 16:23
Оценка:
Здравствуйте, Slamin, Вы писали:


S>Скорее всего в CreateInstance была ошибка.

S>1. CoInitialize не был вызван. Если это MFC то нужно вызвать AfxOleInit() в CWinApp::InitInstance, если нет то CoInitialize.
S>2. ProgID не правильный.

S>
S>void TestF()
S>{
S>    DMIE::IMoveURLPtr obj;
S>    HRESULT hr = obj.CreateInstance(L"DMIE.IMoveUrl");
S>    if (SUCCEEDED(hr)) { // Здесь breakpoint.
S>        obj->AddURL("",""); 
S>    }
S>}
S>

S>Если остановиться на breakpoint и добавить в Watch "hr,hr" то можно увидеть текстовую строку об ошибке.
S>Либо можно воспользоваться ::FormatMessage чтобы показать ошибку юзеру.

говорит,что Invalid class string
Re[9]: #import
От: Vi2 Удмуртия http://www.adem.ru
Дата: 05.12.02 16:32
Оценка: 3 (1)
Здравствуйте, Николай, Вы писали:

S>    DMIE::IMoveURLPtr obj;
S>    HRESULT hr = obj.CreateInstance(L"DMIE.IMoveUrl");

[]

Н>говорит,что Invalid class string

Правильно говорит. Здесь нужно использовать или ProgID объекта (строка, под которой объект регистрирует себя в Реестре), или CLSID, который скорее всего есть в файле DMIE.tlh (поищи в этом файле слово "coclass", например,
struct /* coclass */ Cx;
...
struct __declspec(uuid("610b38e0-577f-11d6-a449-004095426e66")) Cx;

и используй __uuidof(этот класс), т.е. __uuidof(Cx)).
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.