может ли COM-сервер перераспределить ([in, out] CACLSID * arg)?
-
03-07-2019 - |
Вопрос
С методом COM-интерфейса, объявленным следующим образом:
[ object,
uuid(....),
]
interface IFoo : IUnknown
{
HRESULT Foo([in, out] CACLSID * items);
}
Что касается маршалинга, разрешено ли серверу перераспределять подсчитанный массив?(Я думать это так, но я уже не уверен)
Его текущая реализация только заменяет существующие идентификаторы, но я хотел бы реализовать изменение (которое не нарушит контракт), которое может возвращать больше элементов без введения нового интерфейса.
[редактировать] пожалуйста, обратите внимание, что CACLSID это уже массив, содержащий счетчик и указатель.
Решение
Я очень давно COM не делал, но можно ли вообще выделить новый массив?В таком случае не должно быть CACLSID ** items
?
Другие советы
Вы должны указать Count в качестве второго параметра, который указывает место для такого количества элементов, используя эту библиотеку COM, маршалирует элементы.
Во-первых, если вы хотите 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);
Опять же, он не скомпилирован, поэтому вам действительно нужно знать, что вы делаете, если используете это.