2009-02-24 4 views
1

Я хотел бы предоставить сборку объектов ATL COM объектов CMainClass так, чтобы к ней можно было обращаться с помощью клиента C#, VB или C++.ATL Коллекция нетривиальных объектов

У меня нет проблемы с настройкой самой коллекции, но я не знаю, как разрешить COM-клиентам доступ к классам A, B и C. Должен ли я сделать A, B, C & 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

Google для реализации IEnumVARIANT в АТЛ.

Вот несколько перспективных ссылок.

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

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

Надеется, что это помогает.

Актуальные ответы на вопросы: Да. Если вы хотите открыть интерфейсы, совместимые с Automation Compatible, то есть те, которые могут быть использованы на языках VB, C# и скриптов, каждый объект должен быть открыт как COM-интерфейс. Также, если вы собираетесь хранить CComPtr <> в списке stl, убедитесь, что вы используете обертку CAdapt <>.

+0

Итак, если я неправильно понял эти примеры, похоже, что ответ «да», каждый класс должен быть COM-объектом, а те, в которых члены std :: list <> должны быть коллекциями COM. – PaulH

Смежные вопросы