Сущность технологии COM



Объекты классов - часть 2


Если для данного класса C++ может существовать лишь один экземпляр (так ведут себя все объекты классов в СОМ), то в любом заданном экземпляре может быть только одна горилла (gorilla). Для некоторых областей одноэлементных множеств достаточно. В случае с гориллами, однако, весьма вероятно, что клиенты могут захотеть создавать приложения, которые будут использовать несколько различных горилл одновременно. Чтобы обеспечить такое использование, объект класса не должен экспортировать интерфейс IApe, а вместо этого должен экспортировать новый интерфейс, который позволит клиентам создавать новых горилл и/или находить известных горилл по их имени. Это потребует от разработчика определить два класса C++: один для реализации объекта класса и другой для реализации действительных экземпляров класса. Для реализации гориллы класс C++, который определяет экземпляры гориллы, будет реализовывать интерфейс IApe:

class Gorilla : public IApe { public: // Instances are heap-based, so delete when done // копии размещены в куче, поэтому удаляем после выполнения IMPLEMENT_UNKNOWN() BEGIN_INTERFACE_TABLE() IMPLEMENTS_INTERFACE(IApe) END_INTERFACE_TABLE() // IApe methods // методы IApe STDMETHODIMP EatBanana(void); STDMETHODIMP SwingFromTree(void); STDMETHODIMP get_Weight(long *plbs): };

Второй интерфейс понадобится для определения тех операций, которые будет реализовывать объект класса Gorilla:

[object, uuid(753A8AAC-A7FF-11d0-8C30-0080C73925BA)] interface IApeClass : IUnknown { HRESULT CreateApe([out, retval] IApe **ppApe); HRESULT GetApe([in] long nApeID, [out, retval] IApe **ppApe); [propget] HRESULT AverageWeight([out, retval] long *plbs); }

Получив это определение интерфейса, объект класса будет реализовывать методы IApeClass или путем создания новых экземпляров С++-класса Gorilla (в случае CreateApe), или преобразованием произвольно выбранного имени объекта (в данном случае типа integer) в отдельный экземпляр (в случае GetApe):

class GorillaClass : public IApeClass { public: IMPLEMENT_UNKNOWN_NO_DELETE(GorillaClass) BEGIN_INTERFACE_TABLE(GorillaClass) IMPLEMENTS_INTERFACE(IApeClass) END_INTERFACE_TABLE() STDMETHODIMP CreateApe(Ape **ppApe) { if ((*ppApe = new Gorilla) == 0) return E_OUTOFMEMORY; (*ppApe)->AddRef(); return S_OK; }




Содержание  Назад  Вперед