powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / События в СОМ
7 сообщений из 7, страница 1 из 1
События в СОМ
    #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
События в СОМ
    #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
События в СОМ
    #33646118
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это, скорее всего, потому, что __IInterface является шаблоном. Инстанцируй его при наследовании:
Код: plaintext
1.
class CIEvents : public __IInterface<....>
...
Рейтинг: 0 / 0
События в СОМ
    #33646219
_Viktor_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В том то и дело, что не является.
...
Рейтинг: 0 / 0
События в СОМ
    #33646362
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Значит __IInterface - абстрактный класс. Надо определить все его абстрактные функции. Надеюсь определения этих
Код: plaintext
1.
2.
3.
CIEvents();
virtual ~CIEvents();
HRESULT STDMETHODCALLTYPE OnData(_bstr_t data_key, _bstr_t data);
ф-ций есть? :)
...
Рейтинг: 0 / 0
События в СОМ
    #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
События в СОМ
    #33646622
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если это ActiveX, то попробуй следующее: Menu Project -> Add To Project -> Registred ActiveX Controls -> 'Forex.IInterface'.

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


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