我使用的是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对象数组的正确方法是什么?
非常感谢您的帮助。
------的 修改 ------
感谢您的回答。我从评论中尝试了这些解决方案,但不幸的是,它仍然无法运行。我需要通过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可能有什么问题?
答案 0 :(得分:3)
不要使用指针。首先将指针存储在变量中,然后复制数据。
VARIANT v;
v.vt = VT_UNKNOWN;
v.punkVal = pMyInterface1;
SafeArrayPutElement(pData, &i, &v);
SafeArrayPutElement
在复制变体时会在内部使用AddRef
。