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

ОглавлениеДобавить в закладки К обложке

HRESULT AverageWeight([out, retval] long *plbs);

}

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

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).


Логин
Пароль
Запомнить меня