Может COM-сервер перераспределить ([in, out] CACLSID * arg)?

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

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

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

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

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

3 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам