powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / VC: обработка событий ADO
2 сообщений из 2, страница 1 из 1
VC: обработка событий ADO
    #32126155
Merl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Есть необходимость обрабатывать некоторые события от ADO. Реализовывать это надо, насколько я понимаю, с использованием того, что MSDN называет Connectable Objects. Согласно этого написал sink-объект (текс приведен ниже), установил соединение (текст тоже ниже), вроде все окей, но когда должно возникнуть событие, компилятор сообщает об ошибке: Access violation.
В чем может быть причина?

Установка соединения
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
IConnectionPoint *pCPAdoRS;
CAdoSink Sink;         
DWORD dwAdoCookie;

// 00000266 - 0000 - 0010 - 8000 -00AA006D2EA4
static const GUID IID_RecordsetEvents = 
{0x00000266,0x0000,0x0010,{0x80,0x0,0x0,0xaa,0x0,0x6d,0x2e,0xa4}};
HRESULT hr; 
IConnectionPointContainer *pCPCtrAdoRS=NULL;

hr = adoRS.m_lpDispatch->QueryInterface(IID_IConnectionPointContainer,(void **)&pCPCtrAdoRS);
hr = pCPCtrAdoRS->FindConnectionPoint(IID_RecordsetEvents, &pCPAdoRS);
hr = pCPAdoRS->Advise(&Sink, &dwAdoCookie);


Реализация sink-объекта
Код: 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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
class CAdoSink : public IDispatch
{
public:
ULONG refCount;

CAdoSink::CAdoSink() {
   refCount =  1 ;
}
CAdoSink::~CAdoSink() {
}



// IUnknown methods.
virtual HRESULT __stdcall QueryInterface(REFIID riid, void **ppvObject)
{
	static const GUID IID_RecordsetEvents = 
	{0x00000403,0x0000,0x0010,{0x80,0x0,0x0,0xaa,0x0,0x6d,0x2e,0xa4}};

	if(IsEqualGUID(riid, IID_IDispatch) || IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_RecordsetEvents))
	{
		this->AddRef();
		*ppvObject = this;
		return S_OK;
	}
	*ppvObject = NULL;
	return E_NOINTERFACE;
}

virtual ULONG _stdcall AddRef(void) {
   return ++refCount;
}

virtual ULONG _stdcall Release(void) {
   if( --refCount <= 0) {
 
      //Delete this;
      return  0 ;
   }
   return refCount;
}

// IDispatch methods.
virtual HRESULT _stdcall GetTypeInfoCount(UINT *pctinfo) {
   if(pctinfo) *pctinfo =  0 ;
   return E_NOTIMPL;
}

virtual HRESULT _stdcall GetTypeInfo(
      UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) {
   return E_NOTIMPL;
}

virtual HRESULT _stdcall GetIDsOfNames(
      REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid,
      DISPID *rgDispId) {
   return E_NOTIMPL;
}

virtual HRESULT _stdcall Invoke(
      DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
      DISPPARAMS *pDispParams, VARIANT *pVarResult,
      EXCEPINFO *pExcepInfo, UINT *puArgErr) 
{
// сами обработчики здесь не приведены, т.к. до сюда делов вообще не доходит
   return S_OK;
}

};
...
Рейтинг: 0 / 0
VC: обработка событий ADO
    #32130659
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / VC: обработка событий ADO
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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