Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как объявить и использовать СОМ интерфейс??? приложил описание его команд  
:(
    Опции темы
secondd
  Дата 15.1.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 25.12.2007

Репутация: нет
Всего: нет



ПОМОГИТЕ!!! pls.  
Как правильно оъявить СОМ интерфейс другой программы, опрашивать его и записывать в него данные в Билдере?
Приложил краткое описание СОМ интерфейса этой проги.
Заранее благодарен.

Присоединённый файл ( Кол-во скачиваний: 29 )
Присоединённый файл  stcln_dev_guide.doc 54,50 Kb
PM MAIL   Вверх
xvr
Дата 16.1.2008, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(secondd @ 15.1.2008,  19:54)
ПОМОГИТЕ!!! pls.  
Как правильно оъявить СОМ интерфейс другой программы, опрашивать его и записывать в него данные в Билдере?
Приложил краткое описание СОМ интерфейса этой проги.
Заранее благодарен.

Вообще то по приведенному описанию очень трудно понять, как его использовать  smile Для начала надо определится, где он вообще установлен и в каком виде (ActiveX, COM). Установленные ActiveX можно затащить в Builder через Component->Import ActiveX Control
PM MAIL   Вверх
EEEEEE
Дата 16.1.2008, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 15.5.2006

Репутация: нет
Всего: нет



Ключевая фраза в описании:
"Программно интерфейс представляет собой COM класс StServer реализующий интерфейс IStServer и генерирующий события в диспетчериземый интерфейс _IStClient."

Конечно нужно проверить, где находится изначально данный COM сервер.
Не хватает файла *.tlb. Или *.срр + *.h. Можно последние попробовать получить в Import Component.

Если IDE отработает нормально, в файле *.h ищи такую тираду:



// *********************************************************************//
// The following typedefs expose classes (named CoCoClassName) that       
// provide static Create() and CreateRemote(LPWSTR machineName) methods   
// for creating an instance of an exposed object. These functions can     
// be used by client wishing to automate CoClasses exposed by this        
// typelibrary.                                                           
// *********************************************************************//



Далее что-то типа такого


// *********************************************************************//
// COCLASS DEFAULT INTERFACE CREATOR
// CoClass  : WordOLEControl
// Interface: TCOM_OLEControl
// *********************************************************************//
typedef TCoClassCreatorT<TCOM_OLEControl, _OLEControl, &CLSID_WordOLEControl, &IID__OLEControl> CoWordOLEControl;


Тебе отсюда нужно CLSID_WordOLEControl и IID__OLEControl для CoCreateInstance, _OLEControl для указателя на интерфейс.


CLSID_StServer и IID_IStServer условные в качестве примера.

Примерно должно быть так...
Код

 CoInitialize(NULL);

IStServer* ptrIStServer;


HRESULT hr = CoCreateInstance(CLSID_StServer, NULL, CLSCTX_SERVER, IID_IStServer, (void**)&ptrIStServer);


if(SUCCEEDED(hr))
{
 //тут работаем с интерфейсом, если он найден


//подчищаем за собой "хвосты" после работы
ptrIStServer->Release();
ptrIStServer = NULL;

}


CoUninitialize();






PM MAIL   Вверх
secondd
Дата 17.1.2008, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 25.12.2007

Репутация: нет
Всего: нет



Огромное спасибо!  а теперь попробую во всем этом разобраться!
Думал все это проще!  smile 
PM MAIL   Вверх
secondd
Дата 30.1.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 25.12.2007

Репутация: нет
Всего: нет



EEEEEE

Спасибо, вроде заработало!!!!!

Еще вопросик: когда программа с комом включена, то все ОК, но если она не работает, то при попытке запустить этот код, помоему на CoCreateInstance, выдается ошибка

Access violation at address 10004DB8 in module 'stcln.dll'. Read of address 0000000C.

Как-нибудь можно сделать чтобы обрабатывать эту ошибку, а то программа вешается.
'stcln.dll' - это и есть библиотека COM.


Это сообщение отредактировал(а) secondd - 1.2.2008, 14:17
PM MAIL   Вверх
EEEEEE
Дата 31.1.2008, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 15.5.2006

Репутация: нет
Всего: нет



Главное условие, чтобы COM-сервер был зарегистрирован. 

Код

if(SUCCEEDED(hr))
{
 //тут работаем с интерфейсом, если он найден


//подчищаем за собой "хвосты" после работы
ptrIStServer->Release();
ptrIStServer = NULL;
}


Попробуй вставить такой фрагмент после кода, указанного выше.
Код

else
{
 char buff[250];
FormatMessage( 0x00001000, 0, hr, 0, buff, sizeof(buff),0);

 Memo1->Lines->Add(AnsiString(buff)); //вывод текстового сообщения, чтобы можно было 
                                                              // прочитать в чём проблема
}




PM MAIL   Вверх
secondd
Дата 31.1.2008, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 25.12.2007

Репутация: нет
Всего: нет



EEEEEE
Спасибо за советы, но не получается записать ошибку в Memo1, похоже при выключенной программе с COM сервером
она вырубается на:

HRESULT hr = CoCreateInstance(CLSID_StServer, NULL, CLSCTX_SERVER, IID_IStServer, (void**)&ptrIStServer);

и дальше не идет, поэтому и в Memo1 не записывает.

ЧТО ЗНАЧИТ  COM   ЗАРЕГИСТРИРОВАН? ГДЕ ПОСМОТРЕТЬ, В РЕЕСТРЕ?
Заранее спасибо!
PM MAIL   Вверх
EEEEEE
Дата 2.2.2008, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 15.5.2006

Репутация: нет
Всего: нет



Попробуй отыскать в реестре.
Странно. Неужто основная программа каждый раз регистрирует сервер автомацизации и потом его удаляет.

Возможно необходимо зарегистртровать сервер самому и не запускать основную программу.


PM MAIL   Вверх
xvr
Дата 2.2.2008, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(secondd @ 30.1.2008,  13:02)
EEEEEE

Спасибо, вроде заработало!!!!!

Еще вопросик: когда программа с комом включена, то все ОК, но если она не работает, то при попытке запустить этот код, помоему на CoCreateInstance, выдается ошибка

Access violation at address 10004DB8 in module 'stcln.dll'. Read of address 0000000C.

Как-нибудь можно сделать чтобы обрабатывать эту ошибку, а то программа вешается.
'stcln.dll' - это и есть библиотека COM.

А кто такая 'программа с комом'? А 'stcln.dll' (библиотека COM) - это COM сервер?
Есть такое предположение, что собственно сервер это и есть та самая программа, которая 'программа с комом', а 'stcln.dll' (сервер COM) на самом деле клиент этой программы, которая сервер, но не COM.
В таком случае проблема заключается в кривости 'stcln.dll' которая пытается присоединится к своему серверу не проверяя факта его работы, и если сервер не работает, то она падает, вместо того, что бы запустить соотвествующий exe'шник  smile 
Выход один - проверять работу РЕАЛЬНОГО сервера до создания COM объекта, и если он не работает, то принудительно его запускать.

PM MAIL   Вверх
some2k7
Дата 4.4.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 4.4.2008

Репутация: нет
Всего: нет



Народ, подскажите пожалуйста по такой проблемке:

Пытаюсь использовать код, предоставленный EEEEEE (респект ему огромный)

Наткнулся на такую ошибку:

[C++ Error] Unit1.cpp(24): E2451 Undefined symbol 'CLSID_StServer'
[C++ Error] Unit1.cpp(24): E2451 Undefined symbol 'IID_IStServer'

Подскажите, откуда могут расти ноги?

В unit1.h добавил строку:

#import "stcln.dll" named_guids

Ошибка рождается  в результате выполнения следующего куска:

Код

using namespace StClientLib;

int main () {

        CoInitialize(NULL);
        IStServer* ptrIStServer;

        HRESULT hr = CoCreateInstance(CLSID_StServer, NULL, CLSCTX_SERVER, IID_IStServer, (void**)&ptrIStServer);

        if(SUCCEEDED(hr))
        {
         //тут работаем с интерфейсом, если он найден


        //подчищаем за собой "хвосты" после работы
        ptrIStServer->Release();
        ptrIStServer = NULL;
        }
        CoUninitialize();

}


Заранее спасибо за помощь smile 
PM MAIL   Вверх
Usya
Дата 14.11.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Здравствуйте!

Новую тему открывать не стал - просто вопрос из той-же оперы. С оъявлением СОМ интерфейса понятно...
Как реализовать подключение к событиям _IStClient - просто вывести на экран что-нибудь из полученных данных. Раньше с COM-ом не работал :( Перелопачивать с нуля тяжеловато.

Буду благодарен за любой приведенный код.

P/s

Из описания:

Цитата

Программно интерфейс представляет собой COM класс StServer реализующий интерфейс IStServer и генерирующий события в диспетчериземый интерфейс _IStClient.


Цитата

В результате подписки _IStClient начнет получать события:

...(в частности)...
HRESULT UpdateQuote(
    BSTR symbol,
    DATE datetime,
    double open,
    double high,
    double low,
    double close,
    double last,
    double volume,
    double size,
    double bid,
    double ask,
    double bidsize,
    double asksize,
    double open_int,
    double go_buy,
    double go_sell,
    double go_base,
    double go_base_backed
);

--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
xvr
Дата 14.11.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Usya @ 14.11.2008,  15:14)
Здравствуйте!

Новую тему открывать не стал - просто вопрос из той-же оперы. С оъявлением СОМ интерфейса понятно...
Как реализовать подключение к событиям _IStClient - просто вывести на экран что-нибудь из полученных данных. Раньше с COM-ом не работал :( Перелопачивать с нуля тяжеловато.


Читать MSDN по ключевым словам IConnectionPointContainer и IConnectionPoint
Architecture of Connectable Objects
PM MAIL   Вверх
Usya
Дата 14.11.2008, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Когда что-то начинаешь изучать с нуля, на русском не всегда понятно что к чему и почему, а про английский и говорить не приходится :(
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
xvr
Дата 15.11.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(Usya @ 14.11.2008,  22:44)
Когда что-то начинаешь изучать с нуля, на русском не всегда понятно что к чему и почему, а про английский и говорить не приходится :(

Код

 IUnknown* root = ...; // Объект, к которому надо приконектится
 DWORD cookie;
 IUnknown* me = ...; // Объект типа _IStClient, его метод UpdateQuote и будет вызываться

 CComQIPtr<IConnectionPointContainer,&IID_IConnectionPointContainer> cpc(root);
 if (!cpc) return; // Error!
 CComPtr<IConnectionPoint> cp;
 HRESULT hr=cpc->FindConnectionPoint(__uuidof(_IStClient),&cp);
 if (SUCCEEDED(hr) || !cp) return; // Error!
 if (do_attach) cp->Advise(me,&cookie); else cp->Unadvise(cookie);

PM MAIL   Вверх
Usya
Дата 16.11.2008, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Спасибо!

Буду пробовать.

Позже напишу, что получилось.

Это сообщение отредактировал(а) Usya - 16.11.2008, 01:40
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0674 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.