Может 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);
Опять же, не скомпилировано, поэтому вам придется знать, что вы делаете, если будете использовать это.