2009-02-24 25 views
1

我想公開一個ATL COM集合的CMainClass對象 ,以便它可以被C#,VB或C++客戶端訪問。ATL非重要對象的集合

我沒有問題,建立集合本身,但我不 知道如何讓COM客戶端訪問類A,B和C. 我應該讓A,B,&Ç COM對象包含一個 std :: list <>每個ATL集合在它們自己的權利?

有沒有更簡單的方法來做到這一點?!?!

感謝, PaulH

class C 
{ 
public: 
    // get/set functions... 

protected: 
    std::string str1_; 
    std::list<std::string> list1_; 
}; 

class A 
{ 
public: 
    // get/set functions... 

protected: 
    std::list<C> list1_; 
}; 

class B 
{ 
public: 
    // get/set functions... 

protected: 
    std::string str1_; 
    std::string str2_; 
}; 

class CMainClass 
{ 
public: 
    void GetA(A* a) const; 
    void SetA(const A& a); 
    void GetB(B* b) const; 
    void SetB(const B& b); 

protected: 
    A a_; 
    B b_; 
}; 

回答

2

谷歌在ATL實現IEnumVARIANT。

這裏有一些有前途的鏈接。

http://msdn.microsoft.com/en-us/library/3stwxh95.aspx

http://www.codeguru.com/cpp/com-tech/atl/misc/article.php/c29

希望這有助於。

迴應你的評論: 是的。如果您想公開自動化兼容接口,即那些可以被VB,C#和腳本語言使用的接口,則每個對象都必須公開爲COM接口。另外,如果您打算將CComPtr <>存儲在stl列表中,請確保使用CAdapt <>包裝器。

+0

所以,除非我誤解了這些例子,它看起來像答案是「是」,每個類都需要是COM對象,而具有std :: list <>的成員需要是COM集合。 – PaulH 2009-02-24 19:55:17