如何使用DISPPARAMS和SAFEARRAY

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

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

  1. LRESULT CMainDlg::OnOK(WORD /*wNotifyCode*/WORD wID, HWND /*hWndCtl*/BOOL/*bHandled*/)
  2. {
  3.     // TODO: Add validation code
  4.     DISPPARAMS param;
  5.     param.cArgs = 3;
  6.     param.cNamedArgs = 0;
  7.     param.rgdispidNamedArgs = NULL;
  8.     param.rgvarg = new VARIANTARG[3];
  9.     param.rgvarg[0].vt = VT_BSTR;
  10.     param.rgvarg[0].bstrVal = SysAllocString(L"A000");
  11.     param.rgvarg[1].vt = VT_BSTR;
  12.     param.rgvarg[1].bstrVal = SysAllocString(L"A111");  
  13.     param.rgvarg[2].vt = VT_BSTR;
  14.     param.rgvarg[2].bstrVal = SysAllocString(L"A222");  

  15.     UserDispparams(¶m);

  16.     SysFreeString(param.rgvarg[0].bstrVal);
  17.     SysFreeString(param.rgvarg[1].bstrVal);
  18.     SysFreeString(param.rgvarg[2].bstrVal);
  19.     delete [] param.rgvarg;

  20.     CloseDialog(wID);
  21.     return 0;
  22. }

  23. // ... ...

  24. HRESULT CMainDlg::UserDispparams(DISPPARAMS* pDispParams)
  25. {
  26.     if (!pDispParams)
  27.         return E_INVALIDARG;
  28.     if (3 != pDispParams->cArgs)
  29.         return E_INVALIDARG;

  30.     wstring strMsg;
  31.     strMsg = strMsg + pDispParams->rgvarg[0].bstrVal + L", ";
  32.     strMsg = strMsg + pDispParams->rgvarg[1].bstrVal + L", ";
  33.     strMsg = strMsg + pDispParams->rgvarg[2].bstrVal + L".";

  34.     MessageBox(strMsg.c_str(), L"UserDispparams", 0x20);

  35.     return S_OK;
  36. }

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

  1. LRESULT CMainDlg::OnOK(WORD /*wNotifyCode*/WORD wID, HWND /*hWndCtl*/BOOL/*bHandled*/)
  2. {
  3.     // TODO: Add validation code
  4.     DISPPARAMS param;
  5.     param.cArgs = 3;
  6.     param.cNamedArgs = 0;
  7.     param.rgdispidNamedArgs = NULL;
  8.     param.rgvarg = new VARIANTARG[3];
  9.     param.rgvarg[0].vt = VT_BSTR;
  10.     param.rgvarg[0].bstrVal = CComBSTR(L"A000").Detach();
  11.     param.rgvarg[1].vt = VT_BSTR;
  12.     param.rgvarg[1].bstrVal = CComBSTR(L"A111").Detach();   
  13.     param.rgvarg[2].vt = VT_BSTR;
  14.     param.rgvarg[2].bstrVal = CComBSTR(L"A222").Detach();
  15.     UserDispparams(¶m);
  16.     delete [] param.rgvarg;
  17.     CloseDialog(wID);
  18.     return 0;
  19. }

  20. // ... ...

  21. HRESULT CMainDlg::UserDispparams(DISPPARAMS* pDispParams)
  22. {
  23.     if (!pDispParams)
  24.         return E_INVALIDARG;
  25.     if (3 != pDispParams->cArgs)
  26.         return E_INVALIDARG;
  27.     wstring strMsg;
  28.     CComBSTR bstr0, bstr1, bstr2;
  29.     bstr0.Attach(pDispParams->rgvarg[0].bstrVal);
  30.     bstr1.Attach(pDispParams->rgvarg[1].bstrVal);
  31.     bstr2.Attach(pDispParams->rgvarg[2].bstrVal);
  32.     strMsg += bstr0;
  33.     strMsg += L", ";
  34.     strMsg += bstr1;
  35.     strMsg += L", ";
  36.     strMsg += bstr2;
  37.     strMsg += L".";
  38.     MessageBox(strMsg.c_str(), L"UserDispparams", 0x20);
  39.     return S_OK;
  40. }

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

  1. LRESULT CMainDlg::OnOK(WORD /*wNotifyCode*/WORD wID, HWND /*hWndCtl*/BOOL/*bHandled*/)
  2. {
  3.     // TODO: Add validation code
  4.     
  5.     DISPPARAMS param;
  6.     param.cArgs = 4;
  7.     param.cNamedArgs = 0;
  8.     param.rgdispidNamedArgs = NULL;
  9.     param.rgvarg = new VARIANTARG[4];
  10.     
  11.     param.rgvarg[0].vt = VT_BSTR;
  12.     param.rgvarg[0].bstrVal = CComBSTR(L"A000").Detach();
  13.     param.rgvarg[1].vt = VT_BSTR;
  14.     param.rgvarg[1].bstrVal = CComBSTR(L"A111").Detach();   
  15.     param.rgvarg[2].vt = VT_BSTR;
  16.     param.rgvarg[2].bstrVal = CComBSTR(L"A222").Detach();
  17.     
  18.     CComSafeArray sa;
  19.     sa.Add(CComBSTR(L"B000").Detach());
  20.     sa.Add(CComBSTR(L"B111").Detach());
  21.     sa.Add(CComBSTR(L"B222").Detach());
  22.     param.rgvarg[3].vt = VT_ARRAY;
  23.     param.rgvarg[3].parray = sa.Detach();
  24.     
  25.     UserDispparams(¶m);
  26.     delete [] param.rgvarg;
  27.     
  28.     _CrtDumpMemoryLeaks();
  29.     CloseDialog(wID);
  30.     return 0;
  31. }
  32. HRESULT CMainDlg::UserDispparams(DISPPARAMS* pDispParams)
  33. {
  34.     if (!pDispParams)
  35.         return E_INVALIDARG;
  36.     if (4 != pDispParams->cArgs)
  37.         return E_INVALIDARG;
  38.     wstring strMsg;
  39.     CComBSTR bstrA0, bstrA1, bstrA2;
  40.     CComBSTR bstrB0, bstrB1, bstrB2;
  41.     CComSafeArray sa;
  42.     bstrA0.Attach(pDispParams->rgvarg[0].bstrVal);
  43.     bstrA1.Attach(pDispParams->rgvarg[1].bstrVal);
  44.     bstrA2.Attach(pDispParams->rgvarg[2].bstrVal);
  45.     sa.Attach(pDispParams->rgvarg[3].parray);
  46.     bstrB0.Attach(sa.GetAt(0));
  47.     bstrB1.Attach(sa.GetAt(1));
  48.     bstrB2.Attach(sa.GetAt(2));
  49.     
  50.     strMsg += bstrA0;
  51.     strMsg += L", ";
  52.     strMsg += bstrA1;
  53.     strMsg += L", ";
  54.     strMsg += bstrA2;
  55.     strMsg += L".";
  56.     strMsg += bstrB0;
  57.     strMsg += L", ";
  58.     strMsg += bstrB1;
  59.     strMsg += L", ";
  60.     strMsg += bstrB2;
  61.     strMsg += L".";
  62.     MessageBox(strMsg.c_str(), L"UserDispparams", 0x20);
  63.     return S_OK;
  64. }


--END--

你可能感兴趣的:(技术笔记)