123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- #ifndef __DualEventCall_h__
- #define __DualEventCall_h__
- #ifndef _INC_STDARG
- #include <stdarg.h>
- #endif
- #ifndef __EventCall_h__
- #include "EventCall.h"
- #endif
- template <class If_vtbl>
- class ATL_NO_VTABLE TCComDualEventCall : public TCComEventCall<If_vtbl>
- {
- public:
- TCComDualEventCall();
- virtual ~TCComDualEventCall();
- private:
- TCComDualEventCall(const TCComDualEventCall&);
- public:
- HRESULT operator()(IDispatch* pdisp);
- protected:
- virtual void OnCreateDispParams() = 0;
- protected:
- void SetDispParams(DISPID dispid, UINT cArgs, ...);
- void SetDispParamsV(DISPID dispid, UINT cArgs, va_list argptr);
- protected:
-
-
-
-
- DISPPARAMS m_DispParams;
-
-
-
- DISPID m_dispid;
- };
- template <class If_vtbl>
- inline TCComDualEventCall<If_vtbl>::TCComDualEventCall() :
- m_dispid(DISPID_UNKNOWN)
- {
-
- ZeroMemory(&m_DispParams, sizeof(m_DispParams));
- }
- template <class If_vtbl>
- TCComDualEventCall<If_vtbl>::~TCComDualEventCall()
- {
- if (NULL != m_DispParams.rgvarg)
- delete [] m_DispParams.rgvarg;
- }
- template <class If_vtbl>
- HRESULT TCComDualEventCall<If_vtbl>::operator()(IDispatch* pdisp)
- {
- HRESULT hr = S_OK;
- if (NULL != pdisp)
- {
-
- char szFn[_MAX_PATH] = "";
- #ifdef _DEBUG
- sprintf(szFn, "TCComDualEventCall<%hs>::operator()",
- TCTypeName(If_vtbl));
- #endif
- __try
- {
-
- if (NULL == m_DispParams.rgvarg)
- OnCreateDispParams();
-
- _VERIFYE(SUCCEEDED(::SetErrorInfo(0, m_pei)));
- hr = pdisp->Invoke(m_dispid, IID_NULL, LOCALE_USER_DEFAULT,
- DISPATCH_METHOD, &m_DispParams, NULL, NULL, NULL);
- #ifdef _DEBUG
- char szMsg[_MAX_PATH];
- sprintf(szMsg, "Invoke for event call %hs", GetEventName());
- if (SUCCEEDED(hr))
- {
-
- }
- else
- {
- strcat(szMsg, " returned");
- TCReportHR(szFn, szMsg, hr);
- }
- #endif _DEBUG
- }
- __except(1)
- {
- _TRACE1("%hs: Caught an unknown exception\n", szFn);
- return E_UNEXPECTED;
- }
- }
-
- return hr;
- }
- #ifdef _DOCJET_ONLY
-
-
-
-
-
-
-
-
-
- template <class If_vtbl>
- virtual void TCComDualEventCall<If_vtbl>::OnCreateDispParams() = 0;
- #endif
- template <class If_vtbl>
- void TCComDualEventCall<If_vtbl>::SetDispParams(DISPID dispid, UINT cArgs,
- ...)
- {
- va_list argptr;
- va_start(argptr, cArgs);
- SetDispParamsV(dispid, cArgs, argptr);
- va_end(argptr);
- }
- template <class If_vtbl>
- void TCComDualEventCall<If_vtbl>::SetDispParamsV(DISPID dispid, UINT cArgs,
- va_list argptr)
- {
-
- assert(NULL == m_DispParams.rgvarg);
-
- m_dispid = dispid;
-
- if (!cArgs)
- return;
-
- m_DispParams.rgvarg = new VARIANTARG[m_DispParams.cArgs = cArgs];
-
- while (cArgs--)
- {
- VariantInit(&m_DispParams.rgvarg[cArgs]);
- VARTYPE vt = va_arg(argptr, VARTYPE);
- switch (V_VT(&m_DispParams.rgvarg[cArgs]) = vt)
- {
- case VT_BOOL:
- V_BOOL(&m_DispParams.rgvarg[cArgs]) = va_arg(argptr, VARIANT_BOOL);
- break;
- case VT_I1:
- V_I1(&m_DispParams.rgvarg[cArgs]) = va_arg(argptr, CHAR);
- break;
- case VT_I2:
- V_I2(&m_DispParams.rgvarg[cArgs]) = va_arg(argptr, SHORT);
- break;
- case VT_I4:
- V_I4(&m_DispParams.rgvarg[cArgs]) = va_arg(argptr, LONG);
- break;
- case VT_UI1:
- V_UI1(&m_DispParams.rgvarg[cArgs]) = va_arg(argptr, BYTE);
- break;
- case VT_UI2:
- V_UI2(&m_DispParams.rgvarg[cArgs]) = va_arg(argptr, USHORT);
- break;
- case VT_ERROR:
- V_ERROR(&m_DispParams.rgvarg[cArgs]) = va_arg(argptr, SCODE);
- break;
- case VT_R4:
- V_R4(&m_DispParams.rgvarg[cArgs]) = va_arg(argptr, FLOAT);
- break;
- case VT_R8:
- V_R8(&m_DispParams.rgvarg[cArgs]) = va_arg(argptr, DOUBLE);
- break;
- case VT_DECIMAL:
- V_DECIMAL(&m_DispParams.rgvarg[cArgs]) = va_arg(argptr, DECIMAL);
- break;
- case VT_CY:
- V_CY(&m_DispParams.rgvarg[cArgs]) = va_arg(argptr, CY);
- break;
- case VT_DATE:
- V_DATE(&m_DispParams.rgvarg[cArgs]) = va_arg(argptr, DATE);
- break;
- case VT_BSTR:
- V_BSTR(&m_DispParams.rgvarg[cArgs]) = va_arg(argptr, BSTR);
- break;
- case VT_UNKNOWN:
- V_UNKNOWN(&m_DispParams.rgvarg[cArgs]) = va_arg(argptr, IUnknown*);
- break;
- case VT_DISPATCH:
- V_DISPATCH(&m_DispParams.rgvarg[cArgs]) = va_arg(argptr, IDispatch*);
- break;
- case VT_VARIANT:
- V_VARIANTREF(&m_DispParams.rgvarg[cArgs]) = va_arg(argptr, VARIANT*);
- break;
- default:
- _TRACE_BEGIN
- _TRACE_PART0("TCComDualEventCall<If_vtbl>::SetDispParamsV(): ");
- _TRACE_PART2("Specified VARTYPE %hu (0x%04X) is unsupported\n", vt, vt);
- _TRACE_END
- _ASSERT(false);
- }
- }
- }
- #endif
|