ATL Коллекция нетривиальных объектов - PullRequest
1 голос
/ 24 февраля 2009

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

У меня нет проблем с настройкой самой коллекции, но я не знать, как разрешить 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_;
};

1 Ответ

2 голосов
/ 24 февраля 2009

Google для реализации IEnumVARIANT в ATL.

Вот несколько многообещающих ссылок.

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

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

Надеюсь, это поможет.

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

...