Re[8]: Ошибка с подсчетом ссылок
От: lol4ever  
Дата: 04.10.06 13:43
Оценка:
Сервер, создание объекта:

    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, в котором передается указатель на кокласс. В нашем методе-обработчике в качестве типа параметра ставим вумный указатель — и все работает (правда, подсчитать ссылки в данном случае я не могу). Опять хак?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.