Как да прехвърлите масив от низове през COM (C++) API

Имаме COM API за нашето приложение (което е написано на VC++), което разкрива няколко функционалности, така че потребителите да могат да автоматизират своите задачи. Сега трябва да добавя нов метод в това, който трябва да върне списък/масив/вектор от низове. Тъй като съм нов в COM, разглеждах съществуващите методи в .idl файла за този интерфейс.

Един от съществуващите методи в този idl файл изглежда така:

interface ITestApp : IDispatch
{
    //other methods ..
    //...
    //...
    //...
    [id(110), helpstring("method GetFileName")] HRESULT GetFileName([out, retval] BSTR *pFileName);
    //...
    //...
    //...
};

Моята задача е да напиша подобен нов метод, но вместо да връща един BSTR низ, той трябва да връща списък/масив/вектор от тях.

Как мога да направя това?

Благодаря!


person Piyush Soni    schedule 31.07.2014    source източник
comment
За съжаление моето копие на Inside Distributed COM показва само пример за необработени низове или int масиви и мина твърде много време, за да си спомня как да направя това.   -  person crashmstr    schedule 31.07.2014
comment
P.S. : Не знам коя част от въпроса не е ясна. Вместо да гласуват за затварянето му, може ли потребителите да попитат? Ако смятате, че въпросът е „твърде широк“ или може да има много отговори, можете да помогнете с поне един или два от тях. Благодаря!   -  person Piyush Soni    schedule 31.07.2014
comment
Не съм гласувал за затваряне, нито съм гласувал против. Ясно ми е какво ви трябва, но съм забравил как да го направя.   -  person crashmstr    schedule 31.07.2014
comment
@crashmstr, извинявам се за объркването, коментарът ми беше за другите гласуващи (3 от тях), които гласуваха за затварянето му, а не за теб. Оценявам коментара ви.   -  person Piyush Soni    schedule 01.08.2014


Отговори (1)


Тъй като вашият интерфейс е съвместим с автоматизация, трябва да използвате safearrays. Би било нещо подобно:

// IDL definition
[id(42)]
HRESULT GetNames([out, retval] SAFEARRAY(BSTR)* names);

// C++ implementation
STDMETHODIMP MyCOMObject::GetNames(SAFEARRAY** names) {
  if (!names) return E_POINTER;
  SAFEARRAY* psa = SafeArrayCreateVector(VT_BSTR, 0, 2);

  BSTR* content = NULL;
  SafeArrayAccessData(psa, (void**)&content);
  content[0] = SysAllocString(L"hello");
  content[1] = SysAllocString(L"world");
  SafeArrayUnaccessData(psa);

  *names = psa;
  return S_OK;
}

Отстраняването на грешки е оставено като упражнение за читателя.

person Igor Tandetnik    schedule 31.07.2014