#include #pragma hdrstop #include "csdisp.h" #include "csprop.h" #define __dwFILE__ __dwFILE_CERTLIB_EXITDISP_CPP__ //+------------------------------------------------------------------------ // ICertExit dispatch support //+------------------------------------ // Initialize method: OLECHAR *exit_apszInitialize[] = { TEXT("Initialize"), TEXT("strConfig"), }; //+------------------------------------ // Notify method: OLECHAR *exit_apszNotify[] = { TEXT("Notify"), TEXT("ExitEvent"), TEXT("Context"), }; //+------------------------------------ // GetDescription method: OLECHAR *exit_apszGetDescription[] = { TEXT("GetDescription"), }; //+------------------------------------ // GetManageModule method: OLECHAR *exit_apszGetManageModule[] = { TEXT("GetManageModule"), }; //+------------------------------------ // Dispatch Table: DISPATCHTABLE g_adtExit[] = { DECLARE_DISPATCH_ENTRY(exit_apszInitialize) DECLARE_DISPATCH_ENTRY(exit_apszNotify) DECLARE_DISPATCH_ENTRY(exit_apszGetDescription) DECLARE_DISPATCH_ENTRY(exit_apszGetManageModule) }; DWORD CEXITDISPATCH (ARRAYSIZE(g_adtExit)); DWORD s_acExitDispatch[] = { CEXITDISPATCH_V2, CEXITDISPATCH_V1, }; IID const *s_apExitiid[] = { &IID_ICertExit2, &IID_ICertExit, }; HRESULT Exit_Init( IN DWORD Flags, IN LPCWSTR pcwszProgID, IN CLSID const *pclsid, OUT DISPATCHINTERFACE *pdi) { HRESULT hr; hr = DispatchSetup2( Flags, CLSCTX_INPROC_SERVER, pcwszProgID, // g_wszRegKeyCIPolicyClsid, pclsid, ARRAYSIZE(s_acExitDispatch), s_apExitiid, s_acExitDispatch, g_adtExit, pdi); _JumpIfError(hr, error, "DispatchSetup"); pdi->pDispatchTable = g_adtPolicy; error: return(hr); } VOID Exit_Release( IN OUT DISPATCHINTERFACE *pdiManage) { DispatchRelease(pdiManage); } HRESULT ExitVerifyVersion( IN DISPATCHINTERFACE *pdiExit, IN DWORD RequiredVersion) { HRESULT hr; CSASSERT(NULL != pdiExit && NULL != pdiExit->pDispatchTable); switch (pdiExit->m_dwVersion) { case 1: CSASSERT( NULL == pdiExit->pDispatch || CEXITDISPATCH_V1 == pdiExit->m_cDispatchTable); break; case 2: CSASSERT( NULL == pdiExit->pDispatch || CEXITDISPATCH_V2 == pdiExit->m_cDispatchTable); break; default: hr = HRESULT_FROM_WIN32(ERROR_INTERNAL_ERROR); _JumpError(hr, error, "m_dwVersion"); } if (pdiExit->m_dwVersion < RequiredVersion) { hr = E_NOTIMPL; _JumpError(hr, error, "old interface"); } hr = S_OK; error: return(hr); } HRESULT Exit_Initialize( IN DISPATCHINTERFACE *pdiExit, IN BSTR strDescription, IN WCHAR const *pwszConfig, OUT LONG *pEventMask) { HRESULT hr; BSTR strConfig = NULL; if (!ConvertWszToBstr(&strConfig, pwszConfig, -1)) { hr = E_OUTOFMEMORY; goto error; } __try { if (NULL != pdiExit->pDispatch) { VARIANT avar[1]; CSASSERT(NULL != pdiExit->pDispatchTable); avar[0].vt = VT_BSTR; avar[0].bstrVal = strConfig; hr = DispatchInvoke( pdiExit, EXIT_INITIALIZE, ARRAYSIZE(avar), avar, VT_I4, pEventMask); _JumpIfError(hr, error, "Invoke(Initialize)"); } else { hr = ((ICertExit *) pdiExit->pUnknown)->Initialize( strConfig, pEventMask); _JumpIfError(hr, error, "ICertExit::Initialize"); } } _finally { if (NULL != strConfig) { SysFreeString(strConfig); } } error: return(hr); } HRESULT Exit_Notify( IN DISPATCHINTERFACE *pdiExit, IN BSTR strDescription, IN LONG ExitEvent, IN LONG Context) { HRESULT hr; if (NULL != pdiExit->pDispatch) { VARIANT avar[2]; CSASSERT(NULL != pdiExit->pDispatchTable); avar[0].vt = VT_I4; avar[0].lVal = ExitEvent; avar[1].vt = VT_I4; avar[1].lVal = Context; hr = DispatchInvoke( pdiExit, EXIT_NOTIFY, ARRAYSIZE(avar), avar, 0, NULL); _JumpIfError(hr, error, "Invoke(Notify)"); } else { hr = ((ICertExit *) pdiExit->pUnknown)->Notify(ExitEvent, Context); _JumpIfError(hr, error, "ICertExit::Notify"); } error: return(hr); } HRESULT Exit_GetDescription( IN DISPATCHINTERFACE *pdiExit, OUT BSTR *pstrDescription) { HRESULT hr; if (NULL != pdiExit->pDispatch) { CSASSERT(NULL != pdiExit->pDispatchTable); hr = DispatchInvoke( pdiExit, EXIT_GETDESCRIPTION, 0, NULL, VT_BSTR, pstrDescription); _JumpIfError(hr, error, "Invoke(GetDescription)"); } else { hr = ((ICertExit *) pdiExit->pUnknown)->GetDescription(pstrDescription); _JumpIfError(hr, error, "ICertExit::GetDescription"); } error: return(hr); } HRESULT Exit2_GetManageModule( IN DISPATCHINTERFACE *pdiExit, OUT DISPATCHINTERFACE *pdiManageModule) { HRESULT hr; ICertManageModule *pManageModule = NULL; hr = ExitVerifyVersion(pdiExit, 2); _JumpIfError(hr, error, "ExitVerifyVersion"); if (NULL != pdiExit->pDispatch) { CSASSERT(NULL != pdiExit->pDispatchTable); hr = DispatchInvoke( pdiExit, EXIT2_GETMANAGEMODULE, 0, NULL, VT_DISPATCH, &pManageModule); _JumpIfError(hr, error, "Invoke(GetManageModule)"); } else { hr = ((ICertExit2 *) pdiExit->pUnknown)->GetManageModule( &pManageModule); _JumpIfError(hr, error, "ICertExit::GetManageModule"); } hr = ManageModule_Init2( NULL != pdiExit->pDispatch, pManageModule, pdiManageModule); _JumpIfError(hr, error, "ManageModule_Init2"); error: return(hr); }