2013-06-25 14 views
0

在實施從我的類引發的事件的連接點,我宣佈我的IDL一個dispinterface像這樣ATL/COM:MIDL編譯器不會輸出UUID的調度接口

[ 
    uuid(123-MY-GENERATED-GUID) 
] 
dispinterface _IMyChangeEvents { 
properties: 
methods: 
    [id(1)] void ItemChanged([in] BSTR changeInformation); 
}; 

根據一些消息來源,包括書「ATL內部」,這應該產生一個DIID__IMyChangeEvents,然後我可以用它從ATL::IConnectionPointImpl<ImplClass, IID>派生我的課程。但是,它也沒有,也不能在CONNECTION_POINT_ENTRY宏中使用__uuidof(_IMyChangeEvents),如文檔中所述,因爲它抱怨「沒有GUID與此對象關聯」。

什麼是正確的實現方式?

+1

該代碼片段看起來不錯,問題在其他地方:IDL未編譯,您不包括從IDL生成的C++文件等。 –

+0

我嘗試刪除生成的頭文件,並在構建項目時重新生成頭文件。但它只包含一個前向聲明,MIDL_INTERFACE和DECLSPEC_UUID都不包含。還有其他來自該文件的接口被發現很好,關於此接口缺少GUID的投訴是唯一留下的錯誤。 –

+0

由於上面的短代碼片段看起來不錯,因此您可以讓我們猜測實際問題出在哪裏。例如,您可能想要在線查看示例,或者查看我的[VbsEvents](http://www.alax.info/trac/public/browser/trunk/Utilities/VbsEvents/)。您將會看到['_IFooEvents'](http://www.alax.info/trac/public/browser/trunk/Utilities/VbsEvents/VbsEvents.idl#L31)會在['_IFooEvents']上生成啓用UUID的'DIID__IFooEvents'。 VbsEvents_i.c'](http://www.alax.info/trac/public/browser/trunk/Utilities/VbsEvents/VbsEvents_i.c#L76),然後由C++代碼包含,特別是通過__uuidof(。 ..)'。 –

回答

2

此代碼片段位於庫{}塊內部還是外部?庫{}以外的所有內容都會進入生成的.h文件。在庫{}中定義或引用的所有內容都會進入生成的.tlb文件。

一個典型的.IDL文件看起來是這樣的:

interface IMyMainInterface {...}; 
dispinterface MyEvents {...}; 

library { 
    coclass MyCoClass { 
    [default] IMyMainInterface; 
    [default, source] MyEvents; 
    } 
} 

這樣一來,你就必須在兩者h和在.TLB一切,爲你的客戶提供方便。

+0

有趣的是,我也成功地嘗試了另一種方式:在'library {}'塊中放置調度接口,並在外部發布事件。感謝有關生成過程的解釋,我認爲我現在更瞭解它。 –