Как зарегистрировать объект Sink для событий SENS - PullRequest
2 голосов
/ 07 марта 2011

Я просматриваю документацию MSDN, в которой говорится, что я могу CoCreateInstance SENS-объект, используя его CLSID .Однако неясно, означает ли __uuidof (SENS) что-либо - поскольку это всего лишь предварительное объявление в файле Sensevts.h.Кроме того, класс SENS предлагает только «исходящие» интерфейсы и помечен как «нереализуемый» (при просмотре через MS Com Viewer), поэтому я не знаю, как ссылаться на экземпляр самого объекта SENS.

ЭтоВ отличие от примера кода для получения экземпляра IShellLink :

HRESULT     hr;
IShellLink* pISL;

hr = CoCreateInstance ( CLSID_ShellLink,         // CLSID of coclass
                    NULL,                    // not used - aggregation
                    CLSCTX_INPROC_SERVER,    // type of server
                    IID_IShellLink,          // IID of interface
                    (void**) &pISL );        // Pointer to our interface pointer

Здесь ShellLink упоминается как «IShellLink».Справедливо.Но какой тип (кроме void *) я должен использовать для получения экземпляра SENS?И помимо проблемы CLSID, как насчет IID, который я собираюсь использовать для SENS?В конечном итоге я хочу работать с интерфейсом SID IID_ISensLogon, но поскольку это исходящий интерфейс, я не могу себе представить, что имеет смысл использовать это здесь.Предположительно мне нужно поговорить с IConnectionPointContainer интерфейсом SENS (несомненно, он реализует это, верно?), Чтобы я мог добраться до ISensLogon.

Короче, кто-то может показать мне, как будет выглядеть пример кодатак что я могу добраться до точки, где я могу вызвать "Advise ()" и начать получать события от SENS?

ОБНОВЛЕНИЕ Я делаю некоторый прогресс, так что мой код теперь выглядитнапример:

#import <es.dll>
#include <EventSys.h>
using namespace EventSystemLib;

//...
::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
do {

    IEventSystemPtr evSystem;
    HRESULT hr = evSystem.CreateInstance(CLSID_CEventSystem);
    if (!SUCCEEDED(hr)){
        break;
    }

    IEventSubscriptionPtr evSubscriber;
    hr = evSystem.CreateInstance(CLSID_CEventSubscription);  
    if (!SUCCEEDED(hr)){
        break;
    }

}while (false);

Проблема в том, что создание CLSID_CEventSubscription завершается неудачно с кодом HRESULT E_NOINTERFACE. Онлайн-документы на эту ошибку предполагают, что я использую неправильную модель потоков.Но я пробовал и COINIT_MULTITHREADED и COINIT_APARTMENTTHREADED, и ни одна из них не изменяет ошибку.Есть какие-нибудь мысли?

Кстати, наиболее близкая вещь, которую я видел к рабочему примеру, - , приведенный в этой ссылке .

Ответы [ 3 ]

2 голосов
/ 07 марта 2011

Согласно другим частям MSDN , вы не создаете объект SENS. Если я читаю это право, вы создаете экземпляр IEventSystem (CLSID_CEventSystem), запрашиваете у него интересующие издателя / классы событий SENS и регистрируете в них свою подписку.

Edit: Для вашей новой проблемы я не уверен в основной причине, однако я обнаружил, что переключение с использования IEventSubscriptionPtr, похоже, работает:

    // Works
    CComPtr<::IEventSubscription> pSub2;
    hr = pSub2.CoCreateInstance(CLSID_CEventSubscription);

    // Doesn't work
    IEventSubscriptionPtr evSubscriber;
    hr = evSystem.CreateInstance(CLSID_CEventSubscription);  
2 голосов
/ 13 апреля 2011

Извините, это ответ, пока не могу комментировать.

В вашем коде есть ошибка, поэтому вы получаете E_NOINTERFACE

 // Doesn't work
IEventSubscriptionPtr evSubscriber;
hr = evSystem.CreateInstance(CLSID_CEventSubscription);  

Должно быть:

IEventSubscriptionPtr evSubscriber;
hr = evSubscriber.CreateInstance(CLSID_CEventSubscription); //Wrong object previously
2 голосов
/ 07 марта 2011

NonCreateable объекты не предназначены для вызывающих объектов для создания экземпляров. Обычно это потому, что объект не имеет смысла сам по себе. Представьте, например, подобъект ячейки электронной таблицы Excel. Вызывающие абоненты не могут CoCreateInstance ячейку, поскольку это не имеет смысла вне таблицы. Однако вызывающая сторона может запросить в таблице указатель на объект ячейки.

Я верю, что SENS - это то же самое. (Действительно плохая) документация говорит о подписке на события через объект Event System CLSID_CEventSystem. Вот где вам нужно начать поиск.

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