如何通过COM(C ++)API传递字符串数组

时间:2014-07-31 18:20:37

标签: c++ arrays string com idl

我们的应用程序有一个COM API(用VC ++编写),它公开了一些功能,以便用户可以自动执行任务。现在,我需要添加一个新方法,它应该返回一个列表/数组/字符串向量。由于我是COM的新手,我正在查看该接口的.idl文件中的现有方法。

该idl文件中的一个现有方法如下所示:

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

我的任务是编写一个类似的新方法,但它不应返回一个BSTR字符串,而应返回它们的列表/数组/向量。

我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分:4)

由于您的是与自动化兼容的界面,因此您需要使用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;
}

错误处理留给读者练习。