Введение в COM
От: John Scherbatov  
Дата: 05.07.01 02:23
Оценка: 159 (31) +1
Статья:
Том Армстронг. Введение в COM
Автор(ы): Том Армстронг

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


Авторы:
John Scherbatov

Аннотация:
В этой главе, позаимствованной из книги "ActiveX-Создание Web-приложений" Тома Армстронга, рассматриваются основные понятия модели COM, такие как интерфейс IUnknown, GUID, фабрики классов и т. д. Кроме того, автор приводит примеры реализации COM-клиентов и COM-серверов с использованием языка C++, Visual Basic и библиотеки ATL.
Статья понравилась, в целом все отлично, но ....
От: DuШes  
Дата: 10.09.02 12:18
Оценка:
Статья понравилась, в целом все отлично, но только вот очень мало информации
по инетрефейсу IDispatch/// хотелось бы узнать побольше..
А как сделать клиента на VC++?
От: server_mouse Беларусь  
Дата: 28.06.02 00:52
Оценка:
Клиент на VB это конечно просто, однако IMHO недостаточно наглядно. Я не смог реализовать клиента для сервера на ATL с ранним связыванием:
IMath* pMath = NULL;
hr = pUnk->QueryInterface( IID_IMath, (LPVOID*)&pMath );
pUnk->Release();
if ( FAILED( hr ))
{
printf("QueryInterface() for IMath failed\n");
return -1;
}

long result;
pMath->Multiply( 100, 8, &result );
Вот здесь-то сервер и валится с эксцепшином. В чём трабла?
Если человек программист, то это надолго.
Вопросик
От: Akulov  
Дата: 19.02.02 05:59
Оценка:
Не понял как серверу указать свою обработку событий
Вопрос неспециалиста
От: g_i  
Дата: 09.02.02 02:44
Оценка:
Никогда не занимался COM, решил попробовать. Скомпилировал пример (клиент и сервер без ATL), зарегистрировал компонент — CoGetClassObject возвращает ошибку, pCF=0.
Подскажите, в чем может быть проблема? VC++ 6.0, NT4.0.
просто философски рассуждая...
От: Altmenn about:blank
Дата: 06.12.01 01:55
Оценка:
Фабрика классов — это, по-моему не просто так себе, а серъезный шаг человечества...Однако, если Бог поступал таким же образом, создавая человека, то с
virtual HRESULT CreateInstance(LPUNKNOWN pUnk, REFIID riid, void** ppv)=0;
все и так ясно, а вот
virtual HRESULT LockServer (BOOL fLock) = 0;
выглядит интересно:))
Статья просто супер!!!!
От: Аноним  
Дата: 28.09.01 03:48
Оценка:
Всё по полочкам разложено, понятным языком без умных фраз:) !!!
По более таких бы статей!
Рис.7, Рис.8
От: Eugene  
Дата: 22.09.01 10:02
Оценка:
Рис.7 это, видимо, Рис.8, а рисунка консольного проекта нет.
(потерялся при верстке?:)
Don't trouble trouble until trouble troubles you
Прекрасный перевод и отличные выдержки
От: Evdokimov Alexander  
Дата: 26.08.01 23:16
Оценка: +2
Прекрасный перевод и отличные выдержки!
Успехов.
A u menya oceni rannee medlennee rabotaet...
От: Аноним  
Дата: 06.07.01 02:23
Оценка:
A u menya oceni rannee medlennee rabotaet cem prosto rannee...
Re: Вопрос неспециалиста
От: asto  
Дата: 09.02.02 03:15
Оценка:
Скорее всего незарегистрирован компонент. Проверьте путь в Server.reg
Re:A u menya oceni rannee medlennee rabotaet...
От: John Scherbatov  
Дата: 12.07.01 16:19
Оценка: +1
Возможно вы проводили не объективные тесты или же не поняли сущности очень раннего, раннего и позднего связывания. Попробую объяснить ещё раз.
Фактически есть 2 типа связывания — ранее и позднее. Раннее — это когда информацию о типах СОМ-сервера вы предоставляете компилятору ещё на этапе разработки проекта, например с помощью tlb файла вашего сервера. Позднее связывание — это когда подобная информация становится вам доступна только во время выполнения с помощью метода Invoke.
Однако, клиент, использующий раннее связывание может вызывать как сервер реализованный в ЕХЕ, так и в ДЛЛ. Так вот, когда вызывается ДЛЛ, то это есть очень раннее связывание. И оно не может работать(если специально не постараться) медлееннее, чем просто раннее( ЕХЕ-сервер), так как сама ДЛЛ грузится в адресное пространство клиета и работает без каких-либо процедур межпроцессного маршалинга, которые применяются в случае ЕХЕ серверов.

Если остались вопросы, то пишите на мыло.
Re:A u menya oceni rannee medlennee rabotaet...
От: SVV Беларусь  
Дата: 26.08.02 07:42
Оценка:
А где-ж ваше мыло взять-то? Вопрос такой:
нужно попользоваться интерфейсом IHTMLRuleStyle (стандартный). Расскажите пожалуйста как нужно действовать чтоб это сделать, а то не получается. Проект могу выслать на мыло (150 Кб в архиве). Мне кажется что моя проблема в том, что зная имя интерфейса я не могу правильно определить его uuid и clsid. Мое мыло Earth@Tut.By
Re: Введение в COM
От: vguzev http://u.pereslavl.ru/~vadim/MCSharp/
Дата: 07.04.06 23:22
Оценка:
Здравствуйте, John Scherbatov, Вы писали:

JS>Статья:

JS>Том Армстронг. Введение в COM
Автор(ы): Том Армстронг

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


Всё конечно интересно написано, но прочитав где-то треть статьи (и параллельно пробуя компилировать код) застрял... дошёл где-то до создания фабрик.
Сам только изучаю C++ (всю жизнь писал на яве и C#), так что сорри, если некоторые вопросы покажутся очевидными или глупыми...

1. Опечатка — REFID вместо REFIID
class IUnknown
{
public:
virtual HRESULT QueryInterface(REFID riid, void** ppv)=0;
virtual ULONG AddRef () = 0;
virtual ULONG Release() = 0;
};

2. Опечатка — ‘;’ вместо ‘:’

HRESULT Math::QueryInterface( REFIID riid, void** ppv )
{
switch( riid )
{
case IID_IUnknown:
case IID_IMath;
*ppv = this;
// Поскольку мы возвращаем новый указатель на
// интерфейс, необходимо вызвать метод AddRef
AddRef();
return ( S_OK ) ;

default:
return ( E_NOINTERFACE );
}
}

3. Что такое IID_IUnknown, IID_IMath? Как генерить их значения?

(
Сделал временно заглушку
#define IID_IUnknown _HRESULT_TYPEDEF_(0x11111111L)
#define IID_IMath _HRESULT_TYPEDEF_(0x22222222L)
)

4. При компиляции следующего участка кода:
HRESULT Math::QueryInterface( REFIID riid, void** ppv )
{
switch( riid )
{
case IID_IUnknown:
case IID_IMath:
*ppv = this;
// Поскольку мы возвращаем новый указатель на
// интерфейс, необходимо вызвать метод AddRef
AddRef();
return ( S_OK ) ;

default:
return ( E_NOINTERFACE );
}
}

Выдаётся ошибка

Error 1 error C2450: switch expression of type 'const IID' is illegal c:\projects\cplusplustests\mathtest\mathtest\mathtest.cpp 58


5. При компиляции InterlockedDecrement( &m_lRef ); выдаётся ошибка:

Error 2 error C2664: 'InterlockedDecrement' : cannot convert parameter 1 from 'DWORD *__w64 ' to 'volatile LONG *' c:\projects\cplusplustests\mathtest\mathtest\mathtest.cpp 76

В VS C++ 2005 определение функции InterlockedDecrement:

WINBASEAPI
LONG
WINAPI
InterlockedDecrement (
__inout LONG volatile *lpAddend
);

6. То же самое и для InterlockedIncrement

Error 3 error C2664: 'InterlockedIncrement' : cannot convert parameter 1 from 'DWORD *__w64 ' to 'volatile LONG *' c:\projects\cplusplustests\mathtest\mathtest\mathtest.cpp 92

7. Что такое LPUNKNOWN?

class IClassFactory : public IUnknown
{
public:
virtual HRESULT CreateInstance(LPUNKNOWN pUnk, REFIID riid, void** ppv)=0;
virtual HRESULT LockServer (BOOL fLock) = 0;
};

Error 4 error C2061: syntax error : identifier 'LPUNKNOWN' c:\projects\cplusplustests\mathtest\mathtest\mathtest.cpp 99

!!! Вроде бы должно решаться подключением #include "afxwin.h", где объявлен public typedef IUnknown* LPUNKNOWN;

Но тогда при компиляции выдаётся:

Error 1 fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d] c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h 24
Вадим Б. Гузев
http://u.pereslavl.ru/~vadim/MCSharp/
Re: Отличная статья!
От: Аноним  
Дата: 30.06.06 15:08
Оценка:
Олтличная статься! автору большое спасибо, единственная нормальная статься из тех, что мне попадались, и написанна простым языком, еще раз спасибо!
Re: Введение в COM
От: strcpy Россия  
Дата: 10.07.06 08:28
Оценка:
Здравствуйте, John Scherbatov, Вы писали:

JS>Статья:

JS>Том Армстронг. Введение в COM
Автор(ы): Том Армстронг

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



В статье содержится deadlink на www.activex.org.
(This domain was recently acquired by Pool.com.)
Удвой число ошибок, если не получается добиться цели.
Re: Введение в COM
От: strcpy Россия  
Дата: 10.07.06 08:36
Оценка:
Здравствуйте, John Scherbatov, Вы писали:

JS>Статья:

JS>Том Армстронг. Введение в COM
Автор(ы): Том Армстронг

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


Если мне не изменяет знание C++, то
к каждому прототипу в данном примере
нужно приписать virtual.

class Math : public IMath
{
public:
long Add(long Op1, long Op2);
long Subtract(long Op1, long Op2);
long Multiply(long Op1, long Op2);
long Divide (long Op1, long Op2);
};

(не уверен)
Удвой число ошибок, если не получается добиться цели.
Re[2]: Введение в COM
От: strcpy Россия  
Дата: 10.07.06 08:46
Оценка:
S>class Math : public IMath
S>{
S>public:
S> long Add(long Op1, long Op2);
S> long Subtract(long Op1, long Op2);
S> long Multiply(long Op1, long Op2);
S> long Divide (long Op1, long Op2);
S>};

S>(не уверен)


Виноват. ошибся.
Удвой число ошибок, если не получается добиться цели.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.