【问题标题】:How to pass an array of strings through a COM (C++) API如何通过 COM (C++) API 传递字符串数组
【发布时间】:2014-09-23 19:56:11
【问题描述】:

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

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

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

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

我该怎么做?

谢谢!

【问题讨论】:

  • 抱歉,我的 Inside Distributed COM 副本只显示了原始字符串或 int 数组的示例,并且已经太久不记得如何执行此操作了。
  • P.S. : 我不确定问题的哪一部分不清楚。用户可以问一下,而不是投票关闭它吗?如果您认为这个问题“过于宽泛”或可能有很多答案,您至少可以帮助解决其中的一两个问题。谢谢!
  • 我没有投票关闭,也没有投反对票。我很清楚你需要什么,但我忘记了如何去做。
  • @crashmstr,对于造成的混乱,我深表歉意,我的评论是针对投票关闭它的其他投票(其中 3 票),而不是针对您。感谢您的评论。

标签: c++ arrays string com idl


【解决方案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;
}

错误处理留给读者练习。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-05
    • 2011-10-08
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2012-07-13
    相关资源
    最近更新 更多