Нужна помощь с событиями в COM в чистом C ++! - PullRequest
1 голос
/ 08 июня 2010

ребята! Очень важный вопрос:

Пожалуйста, посмотрите на мой проект (300Кб) . Я не могу использовать MFC / ATL, только чистый C ++.

У меня есть библиотека COM (niapi.dll), но нет доступных источников / заголовков, только DLL.

Существует класс для подключения к серверу (NiApi :: SrvrSession), класс имеет обработчик событий входа в систему (NiApi :: SrvrSession :: OnLogin).

Я использовал

#import "NiApi.dll"

для создания упаковщиков / информации,

тогда

ISrvrSessionPtr session(L"NiApi.SrvrSession");

для создания объекта, затем попытка

session->put_OnLogin();

для назначения событий, но нет ни одного put_On или такого члена.

niapi.tlh имеет внутри структуру _ISrvrSessionEvents, но не имеет отношения к SrvrSession.

Мне нужно использовать события из NiApi :: SrvrSession для обработки состояния соединения.

Пожалуйста, помогите или мой босс убьет меня! (извините за ломаный английский, я читаю лучше, чем говорю;)

Ответы [ 3 ]

2 голосов
/ 08 июня 2010

COM события обрабатываются через точки подключения.Вам нужно написать свой собственный COM-объект, который реализует любой интересующий вас интерфейс событий. Затем вам нужно подключить его к COM-объекту, который запускает события.Сначала вы QI COM-объект для его IConnectionPointContainer, а затем найти соответствующую точку подключения GUID интерфейса события.Вы вызываете метод Advise, чтобы подключить его к приемнику событий.

class CSrvrSessionEvents: public _ISrvrSessionEvents
{
public:
    HRESULT OnLogin(long LoginResult)
    {
        // do something
        return S_OK;
    }
    // implement rest of _ISrvrSessionEvents
};

ISrvrSession* pSrvrSession = ...; // get ISrvrSession from somewhere
_ISrvrSessionEvents* pSrvrSessionEvents = new CSrvrSessionEvents();
IConnectionPointContainer* pCPC = NULL;
pSrvrSession->QueryInterface(IID_IConnectionPointContainer, &pCPC);
IConnectionPoint* pCP = NULL;
pCPC->FindConnectionPoint(__uuidof(_ISrvrSessionEvents), &pCP);
DWORD dwCookie = 0;
pCP->Advise(pSrvrSessionEvents, &dwCookie);
pSrvrSession->Connect(); // I assume this fires some events
pCP->Unadvise(dwCookie);
1 голос
/ 08 июня 2010

Что действительно необходимо, так это внимательно прочитать codeproject_TEventHandler .

Все объяснено здесь.

0 голосов
/ 08 июня 2010

Префикс put_ равен префикс по умолчанию для интерфейса raw (настраивается с помощью атрибута raw_property_prefixes) . Поскольку вы не используете необработанный интерфейс, используйте вместо него session-> OnLogin = ....

Об обработке событий см. Пример модели событий ADO (VC ++)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...