Сущность технологии СОМ. Библиотека программиста | страница 82



):


class GorillaClass : public IApeClass

{

public: IMPLEMENTUNKNOWNNODELETE(GorillaClass)

BEGININTERFACETABLE(GorillaClass)

IMPLEMENTSINTERFACE(IApeClass)

ENDINTERFACETABLE()

STDMETHODIMP CreateApe(Ape **ppApe)

{

if ((*ppApe = new Gorilla) == 0) return EOUTOFMEMORY;

(*ppApe)->AddRef();

return SOK;

}

STDMETHODIMP GetApe(long nApeID, IApe **ppApe)

{

// assume that a table of well-known gorillas is

// being maintained somewhere else

// допустим, что таблица для известных горилл

// поддерживается где-нибудь еще

extern Gorilla *grgWellKnownGorillas[];

extern int gnMaxGorillas;

// assert that nApeID is a valid index

// объявляем, что nApeID – допустимый индекс

*ррАре = 0;

if (nApeID > gnMaxGorillas || nApeID < 0) return EINVALIDARG;

// assume that the ID is simply the index into the table

// допустим, что ID – просто индекс в таблице

if ((*ppApe = grgWellKnownGorillas[nApeID]) == 0) return EINVALIDARG;

(*ppApe)->AddRef();

return SOK;

}

STDMETHODIMP getAverageWeight(long *plbs)

{

extern *grgWellKnownGorillas[];

extern int gnMaxGorillas;

*plbs = 0;

long lbs;

for (int i = 0; i < gnMaxGorillas; i++)

{

grgWellKnownGorillas[i]->getWeight(&lbs);

*plbs += lbs;

}

// assumes gnMaxGorillas is non-zero

// предполагается, что gnMaxGorillas ненулевой

*plbs /= gnMaxGorillas;

return SOK;

}

};


Отметим, что в этом коде предполагается, что внешняя таблица известных горилл уже поддерживается – или самими копиями Gorilla, или каким-нибудь другим посредником (agent).


Активация

Клиентам требуется механизм для поиска объектов класса. В силу динамической природы СОМ это может привести к загрузке библиотеки DLL или запуску обслуживающего процесса (server process). Эта процедура вызова объекта к жизни называется активацией объекта.

В СОМ имеется три модели активации, которые можно использовать для занесения объектов в память, чтобы сделать возможными вызовы методов. Клиенты могут попросить СОМ связать объект класса с данным классом. Кроме того, клиенты могут попросить, чтобы СОМ создала новые экземпляры классов, определенные с помощью CLSID. Наконец, клиенты могут попросить СОМ вызвать к жизни перманентный (persistent) объект, состояние которого определено как постоянное. Из этих трех моделей только первая (связывание с объектом класса) является абсолютно необходимой. Две другие модели являются просто оптимизациями обычно применяющихся способов активации. Дополнительные, определенные пользователем, модели активации могут быть реализованы в терминах одного (или более) из этих трех примитивов.