/*++=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Copyright (c) 2000 Microsoft Corporation Module Name: dispatch.cxx Abstract: Implements the IDispatch interface for the W3Spoof object. Author: Paul M Midgen (pmidge) 18-January-2001 Revision History: 18-January-2001 pmidge Created =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--*/ #include "common.h" // // WARNING: do not modify these values. use disphash.exe to generate // new values. // DISPIDTABLEENTRY g_W3SpoofDisptable[] = { 0x021fca0d, DISPID_W3SPOOF_REGISTERCLIENT, L"registerclient", 0x008a2dce, DISPID_W3SPOOF_REVOKECLIENT, L"revokeclient" }; DWORD g_cW3SpoofDisptable = (sizeof(g_W3SpoofDisptable) / sizeof(DISPIDTABLEENTRY)); LPWSTR g_wszW3SpoofObjectName = L"w3spoof"; //----------------------------------------------------------------------------- // IDispatch //----------------------------------------------------------------------------- HRESULT __stdcall CW3Spoof::GetTypeInfoCount(UINT* pctinfo) { DEBUG_ENTER(( DBG_DISPATCH, rt_hresult, "CW3Spoof::GetTypeInfoCount", "this=%#x; pctinfo=%#x", this, pctinfo )); HRESULT hr = S_OK; if( !pctinfo ) { hr = E_POINTER; } else { *pctinfo = 1; } DEBUG_LEAVE(hr); return hr; } HRESULT __stdcall CW3Spoof::GetTypeInfo(UINT index, LCID lcid, ITypeInfo** ppti) { DEBUG_ENTER(( DBG_DISPATCH, rt_hresult, "CW3Spoof::GetTypeInfo", "this=%#x; index=%#x; lcid=%#x; ppti=%#x", this, index, lcid, ppti )); HRESULT hr = S_OK; if( !ppti ) { hr = E_POINTER; } else { if( index != 0 ) { hr = DISP_E_BADINDEX; *ppti = NULL; } else { hr = GetTypeInfoFromName(g_wszW3SpoofObjectName, m_ptl, ppti); } } DEBUG_LEAVE(hr); return hr; } HRESULT __stdcall CW3Spoof::GetIDsOfNames(REFIID riid, LPOLESTR* arNames, UINT cNames, LCID lcid, DISPID* arDispId) { DEBUG_ENTER(( DBG_DISPATCH, rt_hresult, "CW3Spoof::GetIDsOfNames", "this=%#x; riid=%s; arNames=%#x; cNames=%d; lcid=%#x; arDispId=%#x", this, MapIIDToString(riid), arNames, cNames, lcid, arDispId )); HRESULT hr = S_OK; UINT n = 0L; if( !IsEqualIID(riid, IID_NULL) ) { hr = E_INVALIDARG; goto quit; } while( n < cNames ) { arDispId[n] = GetDispidFromName(g_W3SpoofDisptable, g_cW3SpoofDisptable, arNames[n]); ++n; } quit: DEBUG_LEAVE(hr); return hr; } HRESULT __stdcall CW3Spoof::Invoke(DISPID dispid, REFIID riid, LCID lcid, WORD flags, DISPPARAMS* pdp, VARIANT* pvr, EXCEPINFO* pei, UINT* pae) { DEBUG_ENTER(( DBG_DISPATCH, rt_hresult, "CW3Spoof::Invoke", "this=%#x; dispid=%s; riid=%s; lcid=%#x; flags=%#x; pdp=%#x; pvr=%#x; pei=%#x; pae=%#x", this, MapDispidToString(dispid), MapIIDToString(riid), lcid, flags, pdp, pvr, pei, pae )); HRESULT hr = S_OK; hr = ValidateDispatchArgs(riid, pdp, pvr, pae); if( FAILED(hr) ) goto quit; switch( dispid ) { case DISPID_W3SPOOF_REGISTERCLIENT : { hr = ValidateInvokeFlags(flags, DISPATCH_METHOD, FALSE); if( SUCCEEDED(hr) ) { hr = ValidateArgCount(pdp, 2, FALSE, 0); if( SUCCEEDED(hr) ) { hr = RegisterClient( V_BSTR(&pdp->rgvarg[1]), V_BSTR(&pdp->rgvarg[0]) ); } } } break; case DISPID_W3SPOOF_REVOKECLIENT : { hr = ValidateInvokeFlags(flags, DISPATCH_METHOD, FALSE); if( SUCCEEDED(hr) ) { hr = ValidateArgCount(pdp, 1, FALSE, 0); if( SUCCEEDED(hr) ) { hr = RevokeClient( V_BSTR(&pdp->rgvarg[0]) ); } } } break; default : hr = DISP_E_MEMBERNOTFOUND; } quit: if( FAILED(hr) ) { hr = HandleDispatchError(L"w3spoof object", pei, hr); } DEBUG_LEAVE(hr); return hr; }