Сервер, создание объекта:
CComPtr<IMyInterface> pMyInterface;
CComObject<CMyInterfaceCoclass>* pMyInterfaceCoclass;
HRESULT hrCreateInstance = CComObject<CMyInterfaceCoclass>::CreateInstance(& pMyInterfaceCoclass);
if (FAILED(hrCreateInstance)) return FALSE;
HRESULT hrQueryInterface = pMyInterfaceCoclass->QueryInterface(IID_IMyInterface, (LPVOID*)&pMyInterface);
if (FAILED(hrQueryInterface)) return FALSE;
HRESULT hr = Fire_OnMyEvent(pMyInterface); //собсна генереная функция
if (FAILED(hr)) return FALSE;
Описание события:
[id(1), helpstring("method OnMyEvent")] HRESULT OnMyEvent([in] IMyInterface* pMyInterface);
Теперь клиент (подписка на событие сделана через наследование от IDispEventImpl; был сделан #import библиотеки с rename_namespace("MyLibNameSpace")), функция обработчик:
void _stdcall EventHandler(MyLibNameSpace::IMyInterfacePtr pMyInterface)
{
...
}
Этот вариант вызывает ошибку. Ошибка сделана мной, но какая-то она странная — когда вызывается данная функция, то вызывается она через реализацию инвока в IDispEventSimpleImpl (от которого IDispEventImpl наследуется), а там инвок осуществляется динамическим формированием стека при помощи функции DispCallFunc. Стек формируется, размеры _com_ptr_t и интерфейса совпадают, так что стек не рушится. Однако и конструктор _com_ptr_t не вызывается.
Правильно было бы (так и сделал в итоге) нужно сделать так:
void _stdcall EventHandler(MyLibNameSpace::IMyInterface* pMyInterface)
{
...
}
Если я где-то не прав, поправьте меня пожалуйста! А так это получается небольшой хак...
Но вот в связи с этим всем возникает вот какой вопрос: берем ворд. Подцепляемся к событиям. Ловим событие OnDocOpen, в котором передается указатель на кокласс. В нашем методе-обработчике в качестве типа параметра ставим вумный указатель — и все работает (правда, подсчитать ссылки в данном случае я не могу). Опять хак?