class GorillaClass : public IApe
{
public:
// class objects are singletons, so don't delete
// объекты класса существуют в единственном экземпляре,
// так что не удаляйте их
IMPLEMEN
EN
// IApe methods
// методы IApe
STDMETHODIMP EatBanana(void);
STDMETHODIMP SwingFromTree(void);
STDMETHODIMP ge
Если для данного класса C++ может существовать лишь один экземпляр (так ведут себя все объекты классов в СОМ), то в любом заданном экземпляре может быть только одна горилла (gorilla). Для некоторых областей одноэлементных множеств достаточно. В случае с гориллами, однако, весьма вероятно, что клиенты могут захотеть создавать приложения, которые будут использовать несколько
class Gorilla : public IApe
{
public:
// Instances are heap-based, so delete when done
// копии размещены в куче, поэтому удаляем после выполнения
IMPLEMEN
EN
// IApe methods
// методы IApe
STDMETHODIMP EatBanana(void);
STDMETHODIMP SwingFromTree(void);
STDMETHODIMP ge
};
Второй интерфейс понадобится для определения тех операций, которые будет реализовывать объект класса
[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);
}
Получив это определение интерфейса, объект класса будет реализовывать методы
class GorillaClass : public IApeClass
{
public: IMPLEMEN
EN
STDMETHODIMP CreateApe(Ape **ppApe)
{
if ((*ppApe = new Gorilla) == 0) return
}
STDMETHODIMP GetApe(long nApeID, IApe **ppApe)
{
// assume that a table of well-known gorillas is
// being maintained somewhere else
// допустим, что таблица для известных горилл
// поддерживается где-нибудь еще
extern Gorilla *
// assert that nApeID is a valid index
// объявляем, что nApeID – допустимый индекс
*ррАре = 0;
if (nApeID >
// assume that the ID is simply the index into the table
// допустим, что ID – просто индекс в таблице
if ((*ppApe =
(*ppApe)->AddRef();
return
STDMETHODIMP ge
extern int
{
*plbs += lbs;
}
// assumes
return
Отметим, что в этом коде предполагается, что внешняя таблица известных горилл уже поддерживается – или самими копиями
Активация
Клиентам требуется механизм для поиска объектов класса. В силу динамической природы СОМ это может привести к загрузке библиотеки DLL или запуску обслуживающего процесса (server process). Эта процедура вызова объекта к жизни называется активацией объекта.