Лучший способ отправить массив пар ключ-значение в API в COM - PullRequest
1 голос
/ 15 мая 2009

Я хочу создать интерфейс с API, который может принимать массив пар ключ-значение в COM. Каков наилучший способ сделать это? Я могу думать об отправке SAFEARRAY из BSTR. Каждый BSTR можно рассматривать как пару ключ-значение. Необходимо добавить логику упаковки / распаковки ключей.

Ответы [ 4 ]

2 голосов
/ 15 мая 2009

Вы можете ввести интерфейс для пары ключ-значение и еще один для сбора таких пар.

1 голос
/ 15 мая 2009

Я бы не использовал BSTR для нестрокового использования - это может сэкономить вам наносекунду, но в конечном итоге создаст проблемы, если и когда вам понадобится расширить или перенести код. Я бы просто использовал SAFEARRAY вариантов с ключами с индексами 0, 2, 4 ... и соответствующими значениями в 1, 3, 5, ...

0 голосов
/ 23 января 2012

Рассмотрим IPersistPropertyBag для стандартного способа сделать это.

Рассмотрим объект OLE Property Set.

Попробуйте принять Scripting.Dictionary объект или ADODB.Record, если вы создаете что-то быстрое и грязное.

0 голосов
/ 20 мая 2009

Вам нужно определить «лучший». COM - несмотря на наилучшие пожелания дизайнеров - очень разнородная платформа. Характер клиента (он же язык?), Который вы ожидаете, будет взаимодействовать с объектом, должен сильно повлиять на ваш выбор.

Всего два быстрых примера:

  • Вызов из Classing ASP?
    Ваши единственные инструменты ВАРИАНТЫ. Хорошо, вы используете ATL: ваши единственные инструменты - либо BSTR, либо SAFEARRAY от VARIANTS.

  • Быть вызванным из C ++?
    Вы можете использовать собственный массив данных (читайте в [size_is]). Или даже массивы фиксированного размера, если это возможно. Это тонны легче с обеих сторон.

Есть и другие соображения:

Вы пишете клиенту? Тогда вы хотите сделать вещи проще с обеих сторон.

Вы пишете только объект? Тогда вы, вероятно, захотите сделать все на самом легком на клиенте, даже если на сервере сложнее (почему? особенно в консалтинговой или коммерческой среде - не ленитесь!) .

Кроме того, это одноразовый объект? Или это будет использоваться в ряде обстоятельств в будущем? В первом случае вы можете обнаружить, что это действительно не имеет значения. В последнем случае вы захотите тщательно обдумать это.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...