Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / События в СОМ / 7 сообщений из 7, страница 1 из 1
05.04.2006, 10:36
    #33645375
_Viktor_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в СОМ
Привет всем!

Есть Сом объект, в нем 2 интерфейса.
Проект VS.6, MFC.
Делаю импорт.

Далее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
	if ( FAILED( CoInitialize( NULL ))){	return - 1 ;}
	
	char* szProgID = "Forex.IInterface";
	WCHAR  szWideProgID[ 128 ];
 	CLSID clsid;

	long lLen = MultiByteToWideChar( CP_ACP,
                         0 ,
                        szProgID,
                        strlen( szProgID ),
                        szWideProgID,
                        sizeof( szWideProgID ) );

	szWideProgID[ lLen ] = '\0';


	HRESULT hr = ::CLSIDFromProgID( szWideProgID, &clsid );
	if ( FAILED( hr )){		return - 1 ;	}


	IClassFactory* pCF;
	hr = CoGetClassObject(clsid,	CLSCTX_SERVER ,	NULL, IID_IClassFactory,
			(void**) &pCF );
	if ( FAILED( hr )){	return - 1 ;}

	IUnknown* pUnk;
	hr = pCF->CreateInstance( NULL, IID_IUnknown, (void**) &pUnk );

	// Release the class factory
	pCF->Release();

	if ( FAILED( hr ))	{return - 1 ;}

	_IInterface* pInterface = NULL;
	hr = pUnk->QueryInterface( IID__IInterface, (LPVOID*)&pInterface);
	pUnk->Release();
	if ( FAILED( hr ))	{return - 1 ;}


Получаю указатель на один из интерфейчов.
Второй интерфейс содержит методы события?
Как мне переопределить методы события от СОМ.

Плохо знаю COM, и очень срочно надо сделать. Желательно пример.

Заранее благодарю.

С уважением.
...
Рейтинг: 0 / 0
05.04.2006, 13:19
    #33646078
_Viktor_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в СОМ
Предложили сделать подобным образом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
class CIEvents : public __IInterface  
{
	ULONG Refs;

public:
	CIEvents();
	virtual ~CIEvents();

	HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObj)
	{
		if(iid==DIID___IInterface){
		  Refs++;
		  *ppvObj= (__IInterface *)this;
		  return S_OK;
		}
		if (iid == IID_IUnknown){
		  Refs++;
		  *ppvObj= (IUnknown *)this;
		  return S_OK;
		}
		return E_NOINTERFACE;
	}

	ULONG STDMETHODCALLTYPE AddRef(){Refs++; return Refs;}
	ULONG STDMETHODCALLTYPE Release(){
		ULONG l= Refs--;
		if( 0 ==Refs)
		   delete this;
		return l;
	}
    HRESULT STDMETHODCALLTYPE OnData(_bstr_t data_key, _bstr_t data);
};

Но когда я создаю объект m_Event = new CIEvents();
Мне компилятор говорит
error C2259: 'CIEvents' : cannot instantiate abstract class due to following members:
see declaration of 'CIEvents'
...
Рейтинг: 0 / 0
05.04.2006, 13:32
    #33646118
_Балтика
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в СОМ
Это, скорее всего, потому, что __IInterface является шаблоном. Инстанцируй его при наследовании:
Код: plaintext
1.
class CIEvents : public __IInterface<....>
...
Рейтинг: 0 / 0
05.04.2006, 14:00
    #33646219
_Viktor_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в СОМ
В том то и дело, что не является.
...
Рейтинг: 0 / 0
05.04.2006, 14:33
    #33646362
_Балтика
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в СОМ
Значит __IInterface - абстрактный класс. Надо определить все его абстрактные функции. Надеюсь определения этих
Код: plaintext
1.
2.
3.
CIEvents();
virtual ~CIEvents();
HRESULT STDMETHODCALLTYPE OnData(_bstr_t data_key, _bstr_t data);
ф-ций есть? :)
...
Рейтинг: 0 / 0
05.04.2006, 15:23
    #33646591
_Viktor_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в СОМ
Вроде разобрался.
__IInterface производный от IDispatch.
Я переопределил
HRESULT STDMETHODCALLTYPE GetTypeInfoCount(
/* [out] */ UINT __RPC_FAR *pctinfo);

HRESULT STDMETHODCALLTYPE GetTypeInfo(
/* [in] */ UINT iTInfo,
/* [in] */ LCID lcid,
/* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo);

HRESULT STDMETHODCALLTYPE GetIDsOfNames(
/* [in] */ REFIID riid,
/* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames,
/* [in] */ UINT cNames,
/* [in] */ LCID lcid,
/* [size_is][out] */ DISPID __RPC_FAR *rgDispId);

HRESULT STDMETHODCALLTYPE Invoke(
/* [in] */ DISPID dispIdMember,
/* [in] */ REFIID riid,
/* [in] */ LCID lcid,
/* [in] */ WORD wFlags,
/* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,
/* [out] */ VARIANT __RPC_FAR *pVarResult,
/* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo,
/* [out] */ UINT __RPC_FAR *puArgErr);

эти методы и все заработало.
...
Рейтинг: 0 / 0
05.04.2006, 15:27
    #33646622
AndreiNz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
События в СОМ
Если это ActiveX, то попробуй следующее: Menu Project -> Add To Project -> Registred ActiveX Controls -> 'Forex.IInterface'.

Возможно его надо сначала зарегистрировать. После этого он по идее должен появиться в Toolbox-е
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / События в СОМ / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]