Как агрегировать объект COM с ATL

Переводы статьи Переводы статьи
Код статьи: 173823 - Vizualiza?i produsele pentru care se aplic? acest articol.
Примечание Microsoft Visual C++.NET (2002) поддерживает управляемый код модель, предоставляемых платформой Microsoft.NET Framework и неуправляемый машинный код Модель кода Microsoft Windows. В данной статье применима только к неуправляемый код Visual C++.
Развернуть все | Свернуть все

В этой статье

Аннотация

Следующие шаги демонстрируют статистические COM объект в проект ATL:
  1. Добавить указатель IUnknown для объекта класса и инициализировать его значение NULL в конструкторе.
  2. Добавить макрос DECLARE_PROTECT_FINAL_CONSTRUCT для защиты объект от удаления if (FinalConstruct) в процессе внутренней Сводный объект увеличивает счетчик ссылок, а затем уменьшает значение счетчика 0.

    ПРИМЕЧАНИЕ: Если вы используете Visual C++.NET, мастер добавляет это для Вы.
  3. Используйте указатель IUnknown, определяется как второй параметр макросов COM_INTERFACE_ENTRY_AGGREGATE. Первый параметр — Идентификатор IID интерфейса внутренний объект, который требуется Предоставляйте.
  4. Переопределить FinalConstruct() для создания статистическая функция.
  5. Переопределить FinalRelease() для освобождения IUnknown указатель.

Дополнительная информация

Если при использовании версии интерфейса от статистической функции во время FinalConstruct необходимо добавить макрос DECLARE_PROTECT_FINAL_CONSTRUCT Определение объекта класса.

Ниже приведен пример со всеми четыре действия, в определении класса. Это простой объект COutObj объединяет другой простой объект CInnObj.

Пример кода

   class ATL_NO_VTABLE COutObj :
         public CComObjectRootEx<CComSingleThreadModel>,
         public CComCoClass<COutObj, &CLSID_OutObj>,
         public IDispatchImpl<IOutObj, &IID_IOutObj, &LIBID_OUTEROBJLib>
   {
   public:
      COutObj() : m_pInnerUnk(NULL) // Step 1
      {
      }
      DECLARE_GET_CONTROLLING_UNKNOWN()
      DECLARE_REGISTRY_RESOURCEID(IDR_OUTOBJ)
      DECLARE_PROTECT_FINAL_CONSTRUCT() // Step 2

      BEGIN_COM_MAP(COutObj)
         COM_INTERFACE_ENTRY(IOutObj)
         COM_INTERFACE_ENTRY(IDispatch)
         COM_INTERFACE_ENTRY_AGGREGATE(IID_IInnObj, m_pInnerUnk) // Step 3
      END_COM_MAP()

      // Start of step 4
      HRESULT FinalConstruct()
      {
         HRESULT hr;
         CLSID   clsidInner;

         hr = CLSIDFromProgID(L"InnObj.InnObj.1", &clsidInner);
         if (hr == S_OK)
            hr = CoCreateInstance(clsidInner, GetControllingUnknown(),
                                  CLSCTX_INPROC_SERVER, IID_IUnknown,
                                  (void**)&m_pInnerUnk);
         return hr;
      } // End of step 4

      void FinalRelease(){m_pInnerUnk->Release();} // Step 5

      // IOutObj
   public:
      STDMETHOD(Test)();
   private:
      LPUNKNOWN m_pInnerUnk; // Step 1
   };
				
Если внутренний объект в один и тот же сервер ATL, то можно использовать Следующий код для создания внутреннего объекта без CoCreateInstance:
   HRESULT FinalConstruct()
      {
         return  CInnObj::_CreatorClass::CreateInstance(
             GetControllingUnknown(), IID_IUnknown,
             (void**)&m_pInnerUnk);

      }
				

Ссылки

Visual C++ документации: Электронной документации Visual C++; Язык C/C++ и библиотека C++; Библиотека шаблонных классов; Статьи; Введение в COM и ATL; Знакомство с COM; Агрегат

Visual C++ документации: Visual C++ книг; Язык C/C++ и библиотеки C++; Библиотека шаблонных классов; Статьи; Основы ATL COM-объектов; Создание статистического выражения

Свойства

Код статьи: 173823 - Последний отзыв: 4 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft ActiveX Template Library 3.0 на следующих платформах
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ .NET 2002 Standard Edition
    • Microsoft Visual C++ .NET 2003 Standard Edition
Ключевые слова: 
kbarchitecture kbhowto kbmt KB173823 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:173823

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com