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

StackOverflow https://stackoverflow.com/questions/602410

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top