может COM-сервер перераспределить ([in, out] CACLSID * arg)? - PullRequest
0 голосов
/ 02 марта 2009

С методом интерфейса COM, объявленным как:

[ object,
  uuid(....),
]
interface IFoo : IUnknown 
{
  HRESULT Foo([in, out] CACLSID * items);
}

Что касается маршаллинга, разрешено ли серверу перераспределять подсчитанный массив? (Я думаю это так, но я больше не уверен)

Его текущая реализация заменяет только существующие идентификаторы, но я хотел бы реализовать изменение (которое не нарушило бы контракт), которое может возвращать больше элементов без введения нового интерфейса.

[edit] обратите внимание, что CACLSID уже является массивом, содержащим счетчик и указатель.

Ответы [ 3 ]

1 голос
/ 02 марта 2009

Я не делал COM в течение очень долгого времени, но возможно ли даже выделить новый массив? В таком случае это не должно быть CACLSID ** items?

0 голосов
/ 02 марта 2009

Во-первых, если вы хотите, чтобы Foo принял входной массив, вы должны добавить параметр, который дает счетчик, например ::

HRESULT Foo([in] int cItems, [in, out, size_is(cItems)] CACLSID * items);

Предупреждение: этот код не был скомпилирован, просто отключен от документации.

Во-вторых, вы не можете изменять внешнее поведение этого метода без изменения его объявления. Для поддержки изменения размера вы должны иметь возможность перераспределить массив и передать обратно его адрес. Вы можете использовать SAFEARRAY или объявить cItems и items в качестве указателей на исходный тип Foo дублей, например ::

HRESULT FooMutate([in, out] int *cItems, [in, out, size_is(*cItems)] CACLSID **items);

Опять же, не скомпилировано, так что вам придется знать, что вы делаете, если используете это.

0 голосов
/ 02 марта 2009

Вы должны указать Count в качестве второго параметра, который указывает пространство для такого количества элементов, используя эту библиотеку COM, чтобы маршалировать элементы

...