2009-07-27 103 views
3

我正在構建一個類工廠類型的ATL類型庫。事情八九不離十是這樣的:如何防止暴露在ATL類型庫中的coclass實現

[ object, uuid(...), ... ] 
interface INumber : IDispatch { 
    [propget, id(0)] HRESULT Value([out, retval] LONG* pVal); 
} 

[ object, uuid(...), ... ] 
interface INumberFactory : IDispatch { 
    [id(1)] HRESULT GetNumber([in] BSTR numberName, [out, retval] INumber* pVal); 
} 

[ uuid(...) ] 
coclass NumberFactory { 
    [default] interface INumberFactory; 
} 

然後,用戶可以得到實現通過NumberFactoryINumber接口的類的實例。

這很好,但我不知道如何定義和實例化通過NumberFactory.GetNumber()方法返回的ATL對象。如果我在IDL這樣定義的數字:

[ uuid(...) ] 
coclass One { 
    [default] interface INumber; 
} 

One組件類可以由用戶進行實例化。但是我想限制它,所以你可以通過調用NumberFactory.GetNumber("One")獲得一個One coclass的實例。

所以我的問題是:應該如何IDL編寫,因此用戶無法實例One,但仍然能夠然後NumberFactory組件類中實例從OneOneINumber界面返回給用戶?

此外,是否有什麼特別的事情必須在事情的ATL方面完成才能使其工作?

回答

4
  1. 從IDL
  2. 取出的CoClass從目標表中刪除的CoClass(刪除其OBJECT_ENTRY_AUTO)
  3. 保持CNumber類
  4. 你的代碼GetNumber (...)應該是這樣的:
*pVal = new CComObject<CNumber>(); 
(*pVal)->AddRef(); 

這種方式沒有用戶創建的CoClass,您的工廠是唯一可以生成它們的工廠。

+0

非常好!這正是我需要的!謝謝! 這實際上是我找的比我發現的要好,哈哈... – Miquella 2009-07-29 04:54:09

1

顯然,我正在尋找錯誤的東西...我發現在一個相關的問題的回答(從側邊欄),即使我無法找到它,而問這個問題之前,搜索......

的答案是雙重的:

  1. 添加noncreatable至共類定義在IDL
  2. 取下ATL頭文件中的條目OBJECT_ENTRY_AUTO(在底部如果由嚮導生成)

看到這個MSDN文章:http://msdn.microsoft.com/en-us/library/4tc639ss.aspx

+0

實際上,`noncreatable`屬性是一種更好的方法來聲明PublicNotCreatable類,因爲您可以定義源接口並允許[VB6]客戶端Dim WithEvents coclass。否則,客戶端必須使用該接口來進行限制。 – wqw 2009-07-29 19:54:46