如何使用DISPPARAMS和SAFEARRAY

1> DISPPARAMS配合BSTR使用,在调用的函数结束后释放内存
2> DISPPARAMS配合BSTR使用,在调用的函数中释放释放内存
3> DISPPARAMS配合SAFEARRAY的使用,利用CComSafeArray来管理内存

1> DISPPARAMS配合BSTR使用,在调用的函数结束后释放内存
 


LRESULT CMainDlg::OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{    // TODO: Add validation code    
    DISPPARAMS param;    
    param.cArgs = 3;    param.cNamedArgs = 0;    param.rgdispidNamedArgs = NULL;    
    param.rgvarg = new VARIANTARG[3];    
    param.rgvarg[0].vt = VT_BSTR;    param.rgvarg[0].bstrVal = SysAllocString(L"A000");    
    param.rgvarg[1].vt = VT_BSTR;    param.rgvarg[1].bstrVal = SysAllocString(L"A111");      
    param.rgvarg[2].vt = VT_BSTR;    param.rgvarg[2].bstrVal = SysAllocString(L"A222");     
    UserDispparams(&param);    
    SysFreeString(param.rgvarg[0].bstrVal);    
    SysFreeString(param.rgvarg[1].bstrVal);    
    SysFreeString(param.rgvarg[2].bstrVal);    
    delete [] param.rgvarg;    
    CloseDialog(wID);    
    return 0;
}

// ... ...HRESULT CMainDlg::UserDispparams(DISPPARAMS* pDispParams)
{    
	if (!pDispParams)       
	return E_INVALIDARG;    
	if (3 != pDispParams->cArgs)       
	return E_INVALIDARG;    
	wstring strMsg;    
	strMsg = strMsg + pDispParams->rgvarg[0].bstrVal + L", ";    
	strMsg = strMsg + pDispParams->rgvarg[1].bstrVal + L", ";    
	strMsg = strMsg + pDispParams->rgvarg[2].bstrVal + L".";    
	MessageBox(strMsg.c_str(), L"UserDispparams", 0x20);    
	return S_OK;
}

2> DISPPARAMS配合BSTR使用,在调用的函数中释放释放内存

LRESULT CMainDlg::OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{    // TODO: Add validation code    
	DISPPARAMS param;    param.cArgs = 3;    param.cNamedArgs = 0;    
	param.rgdispidNamedArgs = NULL;    
	param.rgvarg = new VARIANTARG[3];    
	param.rgvarg[0].vt = VT_BSTR;    param.rgvarg[0].bstrVal = CComBSTR(L"A000").Detach();    
	param.rgvarg[1].vt = VT_BSTR;    param.rgvarg[1].bstrVal = CComBSTR(L"A111").Detach();       
	param.rgvarg[2].vt = VT_BSTR;    param.rgvarg[2].bstrVal = CComBSTR(L"A222").Detach();    
	UserDispparams(&param);    
	delete [] param.rgvarg;    
	CloseDialog(wID);    
	return 0;
}// ... ...
HRESULT CMainDlg::UserDispparams(DISPPARAMS* pDispParams)
{    
	if (!pDispParams)        
	return E_INVALIDARG;    
	if (3 != pDispParams->cArgs)       
	return E_INVALIDARG;   
	wstring strMsg;    
	CComBSTR bstr0, bstr1, bstr2;    
	bstr0.Attach(pDispParams->rgvarg[0].bstrVal);    
	bstr1.Attach(pDispParams->rgvarg[1].bstrVal);    
	bstr2.Attach(pDispParams->rgvarg[2].bstrVal);    
	strMsg += bstr0;    
	strMsg += L", ";    
	strMsg += bstr1;    
	strMsg += L", ";    
	strMsg += bstr2;    
	strMsg += L".";    
	MessageBox(strMsg.c_str(), L"UserDispparams", 0x20);   
	return S_OK;
}

3> DISPPARAMS配合SAFEARRAY的使用,利用CComSafeArray来管理内存

LRESULT CMainDlg::OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{    // TODO: Add validation code        
	DISPPARAMS param;    param.cArgs = 4;    param.cNamedArgs = 0;    
	param.rgdispidNamedArgs = NULL;    
	param.rgvarg = new VARIANTARG[4];        
	param.rgvarg[0].vt = VT_BSTR;    param.rgvarg[0].bstrVal = CComBSTR(L"A000").Detach();    
	param.rgvarg[1].vt = VT_BSTR;    param.rgvarg[1].bstrVal = CComBSTR(L"A111").Detach();       
	param.rgvarg[2].vt = VT_BSTR;    param.rgvarg[2].bstrVal = CComBSTR(L"A222").Detach();       
	CComSafeArray<BSTR> sa;    
	sa.Add(CComBSTR(L"B000").Detach());    
	sa.Add(CComBSTR(L"B111").Detach());    
	sa.Add(CComBSTR(L"B222").Detach());    
	param.rgvarg[3].vt = VT_ARRAY;    
	param.rgvarg[3].parray = sa.Detach();        
	UserDispparams(&param);   
	delete [] param.rgvarg;        
	_CrtDumpMemoryLeaks();    
	CloseDialog(wID);    
	return 0;}
	
HRESULT CMainDlg::UserDispparams(DISPPARAMS* pDispParams)
{    
	if (!pDispParams)        
	return E_INVALIDARG;    
	if (4 != pDispParams->cArgs)        
	return E_INVALIDARG;    
	wstring strMsg;    
	CComBSTR bstrA0, bstrA1, bstrA2;    
	CComBSTR bstrB0, bstrB1, bstrB2;    
	CComSafeArray<BSTR> sa;    
	bstrA0.Attach(pDispParams->rgvarg[0].bstrVal);    
	bstrA1.Attach(pDispParams->rgvarg[1].bstrVal);    
	bstrA2.Attach(pDispParams->rgvarg[2].bstrVal);    
	sa.Attach(pDispParams->rgvarg[3].parray);    
	bstrB0.Attach(sa.GetAt(0));    
	bstrB1.Attach(sa.GetAt(1));    
	bstrB2.Attach(sa.GetAt(2));        
	strMsg += bstrA0;    strMsg += L", ";    
	strMsg += bstrA1;    strMsg += L", ";   
	strMsg += bstrA2;    strMsg += L".";    
	strMsg += bstrB0;    strMsg += L", ";    
	strMsg += bstrB1;    strMsg += L", ";    
	strMsg += bstrB2;    strMsg += L".";    
	MessageBox(strMsg.c_str(), L"UserDispparams", 0x20);    
	return S_OK;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值