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



         

Указатели и память - часть 2


Если вызывающая программа передала неверный указатель:

Point *ppt; // random unitialized pointer // случайный неинициализированный указатель HRESULT hr = p->g(ppt); // where should proxy copy x & у to? // куда заместитель должен копировать x и у ?

то не найдется легальной памяти, куда метод (или интерфейсный заместитель) мог бы записать значения x и y.

Чем более сложные типы определяются пользователем, тем интереснее становится сценарий. Рассмотрим следующий код IDL:

[uuid(E02E5345-l473-11d1-8C85-0080C73925BA),object ] interface IDogManager : IUnknown { typedef struct tagHUMAN { long nHumanID; } HUMAN;

typedef struct tagDOG { long nDogID; [unique] HUMAN *pOwner; } DOG;

HRESULT GetFromPound([out] DOG *pDog); HRESULT TakeToGroomer([in] const DOG *pDog); HRESULT SendToVet([in, out] DOG *pDog); }

Отличительная особенность этого интерфейса состоит в том, что теперь вызывающая программа должна передать указатель на такой участок памяти, который уже содержит указатель. Можно показать, что для приведенного выше определения метода следующий код является правильным:

DOG fido; // argument is a DOG *, so caller needs a DOG // аргументом является DOG *, поэтому вызывающей программе нужен DOG HUMAN dummy; // the DOG refers to an owner, so alloc space? // DOG ссылается на владельца, поэтому выделяем память? fido.pOwner = &dummy; HRESULT hr = p->GetFromPound(&fido); // is this correct? // правильно ли это?

В данном коде предполагается, что вызывающая программа ответственна за выделение памяти для DOG, который передается по ссылке. В этом смысле код правилен. Однако в этом коде также предполагается, что он отвечает за управление любой памятью более низкого уровня, на которую могут сослаться обновленные значения объекта DOG. Именно здесь данный код отступает от правил СОМ.

СОМ разделяет указатели, участвующие в вызове метода, на две категории. Любые именованные параметры метода, являющиеся указателями, относятся к указателям высшего уровня (top-level).


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