如何向ATL-COM对象传送一个数组?


我想创建一个函数来向ATL-COM对象传送数组.

如下代码的方法用于ACTIVEX中,可能对ATL-COM也有启发吧.

CoInitialize(NULL);
 CLSID m_clsid;
 USES_CONVERSION;
 ::CLSIDFromString(T2OLE("ROUNDANALOG.RoundAnlgAARCtrl.1"), &m_clsid);
 IDispatch FAR* pObj = (IDispatch FAR*)NULL;
 CString str = "UpdateControl";
 BSTR bstr = str.AllocSysString();
 HRESULT hr = CoCreateInstance(m_clsid, NULL, CLSCTX_ALL, IID_IDispatch,
(void**)&pObj);

 SafeArrayAccessData(psa, (void**)&bstrArray);
 bstrArray[0] = str.AllocSysString();
 bstrArray[1] = str.AllocSysString();
 SafeArrayUnaccessData(psa);

VARIANTARG* pvars = new VARIANTARG[1];
 VariantInit(&pvars[0]);
 pvars[0].vt = VT_ARRAY|VT_BYREF|VT_BSTR;
 pvars[0].pparray = &psa;
 DISPID dispid;

 hr = pObj->GetIDsOfNames(IID_NULL, &bstr, 1,LOCALE_USER_DEFAULT, &dispid);

DISPPARAMS disp = {pvars, &dispid, 1,1};
 hr = pObj->Invoke(dispid, IID_NULL,
LOCALE_USER_DEFAULT,DISPATCH_PROPERTYPUT,&disp,NULL, NULL, NULL);
 delete[] pvars;
 pObj->Release();
 CoUninitialize();

在你的控制中建立如下并变量参考:

void CRoundAnlgAARCtrl::SaveFunc(const VARIANT FAR& var)
{
 // TODO: Add your dispatch handler code here
 ASSERT(var.vt == VT_ARRAY | VT_BYREF | VT_BSTR);
 SAFEARRAY* psa = *var.pparray;
}



[返回“一学网www.onestudy.net”首页]