我正在查看MSDN文檔,說我可以CoCreateInstance a SENS object using its CLSID。但是,不清楚__uuidof(SENS)是否意味着什麼 - 因爲它只是Sensevts.h文件中的前向聲明。此外,SENS類只提供「傳出」接口,並被標記爲「不可創建」(通過MS Com Viewer查看),這使我不知道如何引用SENS對象本身的實例。如何爲SENS事件註冊接收對象
這與示例代碼用於獲取一個instance of 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問題,我想用於SENS的IID是什麼?最終,我想使用SENS的IID_ISensLogon接口,但因爲它是一個傳出接口,所以我無法想象在這裏使用它是有意義的。據推測,我需要與SENS的IConnectionPointContainer
接口進行交談(確實它實現了這一點,對吧?),以便我可以進入ISensLogon。
總之,有人可以告訴我樣本代碼的樣子是什麼樣的,以便我可以調用「Advise()」並開始從SENS接收事件?
UPDATE我取得一些進展,讓我的代碼現在看起來像這樣:
#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
。 Online docs for that error建議我使用錯誤的線程模型。但我已經嘗試了COINIT_MULTITHREADED
和COINIT_APARTMENTTHREADED
,但都沒有更改錯誤。有什麼想法嗎?
順便說一句,我見過的最接近的實例是given in this link。
你提到COINIT_APARTMENTTHREADED兩次,所以我不知道你的」實際上已經嘗試過對於它的價值,SensNetDemo使用COINIT_MULTITHREADED。 – Jon 2011-03-08 16:37:05
@Jon:你是對的。我編輯了這篇文章。我確實嘗試過'COINIT_MULTITHREADED' – 2011-03-08 18:50:24
爲我的答案添加了一些代碼以解決您的新問題。 – Jon 2011-03-08 19:13:26