2012-04-06 77 views
1

我正在研究Windows SDK中的DirectShow示例。許多類都具有非默認構造函數。這些構造函數是如何被調用的?誰提供論據?爲什麼COM類需要構造函數?如何在不註冊的情況下使用COM類?

我可以在沒有註冊的情況下在C++程序中使用這些類嗎?如果是這樣,我可以直接使用類構造函數。

如果我使用一個COM類未經登記什麼下面的代碼片段會發生:

Foo * foo = new Foo(.....); // note, not using CoCreateInstance 
Bar * bar = foo->QueryInterface(...); 
bar->Release(); 
delete foo; // CRASH? 

謝謝!

+0

你不知道在一般情況下如何實現'Release'(它甚至可能是空操作,或者使用另一個內存分配器)。在這裏,它很可能會做'刪除這個'。你應該使用'CoCreateInstance' +'Release',這是唯一安全的事情。 – 2012-04-06 15:49:21

回答

2

它與COM無關,它只是以這種方式構建的框架和DirectShow中的構造函數參數BaseClasses是將所有內容放在一起 - 類,祖先,實例化工廠所必需的。

無需註冊即可使用COM類可能是也可能不可能。我懷疑你可能有興趣在不註冊的情況下使用DirectShow過濾器,並且有關該主題的好文章:Using Filters Without Registration

2

一個C++類,作爲實際公開 COM coclass通常不具有帶參數的構造函數。 COM客戶端代碼沒有將參數傳遞給CoCreateInstance()函數的機制。 COM接口通常有一個Initialize()方法來提供所需的初始化。從技術上講,它也可以被修改,CoCreateInstance只是一個隱藏類工廠(IClassFactory)的便利函數。具有自定義CreateInstance()方法的自定義類工廠是可能的,但很少完成。

Microsoft使用基於接口的編程模型,這在非COM代碼中也是COM代碼中很常見的。 DirectX就是一個很好的例子。將Direct3DCreate9Ex()視爲類工廠。

相關問題