【问题标题】:SAFEARRAY of COM objectsCOM 对象的 SAFEARRAY
【发布时间】:2018-04-27 14:25:19
【问题描述】:

我正在使用 COM 库,我在 .tlh 文件中定义了如下接口:

_COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));

然后我创建对象:

//1st object
IMyInterfacePtr pMyInterface1;
pMyInterface1.CreateInstance(CLSID_MyInterface);
pMyInterface1->call_some_method(BSTR("pass example text1"));

//2nd object
IMyInterfacePtr pMyInterface2;
pMyInterface2.CreateInstance(CLSID_MyInterface);
pMyInterface2->call_some_method(BSTR("pass example text2"));

然后我需要创建这些对象的 SAFEARRAY:

SAFEARRAYBOUND rgsabound[1];
rgsabound[0].cElements = 2;
rgsabound[0].lLbound = 0;

SAFEARRAY *pData = SafeArrayCreate(VT_VARIANT, 1, rgsabound);

LONG i = 0;
SafeArrayPutElement(pData, &i, pMyInterface1);
i = 1;
SafeArrayPutElement(pData, &i, pMyInterface2);

但不幸的是,在这个数组元素之后仍然是空的。填充这个 IMyInterfacePtr 对象数组的正确方法是什么?

非常感谢您的帮助。

-----编辑-----

感谢您的回答。我从 cmets 尝试了这些解决方案,但不幸的是,它仍然不起作用。我需要通过 COM 方法将此数组发送回 COM。所以我正在创建一个新对象:

IResponsePtr pResponse;//This is also smart com ptr
pResponse.CreateInstance(CLSID_Response);
pResponse->put_Response(pData);//safearray here

put_Response 具有以下签名:(SAFEARRAY *value)。 不幸的是,在调用此方法期间,我遇到了以下异常:

First-chance exception at 0x76BEC54F in MyApp.exe: Microsoft C++ exception: EEException at memory location 0x0042F144.
First-chance exception at 0x76BEC54F (KernelBase.dll) in MyApp.exe: 0xE0434352 (parameters: 0x80131533, 0x00000000, 0x00000000, 0x00000000, 0x72D30000).

你知道这个 SAFEARRAY ptr 有什么问题吗?

【问题讨论】:

  • 对于异常显示调用堆栈。联系 COM 组件的开发者。也许你的界面是错误的......有很多可能性......你的编辑也是一个新问题。和你原来的没关系。将此问题标记为已回答。创建一个新问题并显示您拥有的新代码。

标签: c++ com safearray


【解决方案1】:

不要使用指针。首先将指针存储在变体中,然后复制数据。

VARIANT v;
v.vt = VT_UNKNOWN;
v.punkVal = pMyInterface1;
SafeArrayPutElement(pData, &i, &v);

SafeArrayPutElement 在复制变体时在内部使用AddRef

【讨论】:

  • 您不应在该示例代码中调用 VariantClear,SafeArray 必须在接口上保留一个引用(当 SafeArray 被清除时,此引用将被删除)。或者先调用 QueryInterface 来定义 v.punkVal (我在这里推荐,分配指针是危险的)
  • 你是对的...改变了我的答案!用户使用了我没有看到的智能指针。
猜你喜欢
  • 2012-08-03
  • 2013-06-16
  • 2011-11-06
  • 2012-05-14
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 2012-09-14
  • 2015-11-03
相关资源
最近更新 更多