windows-nt/Source/XPSP1/NT/admin/pchealth/helpctr/service/trustedscripts/scriptlauncher.cpp
2020-09-26 16:20:57 +08:00

140 lines
3 KiB
C++

/********************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name:
ScriptWrapper_ClientSide.cpp
Abstract:
File for implementation of CPCHScriptLauncher class,
a generic wrapper for remoting scripting engines.
Revision History:
Davide Massarenti created 04/02/2001
********************************************************************/
#include "stdafx.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CPCHScriptWrapper_Launcher::CPCHScriptWrapper_Launcher()
{
// MPC::CComPtrThreadNeutral<IUnknown> m_engine;
m_pCLSID = NULL; // const CLSID* m_pCLSID;
// CComBSTR m_bstrURL;
}
CPCHScriptWrapper_Launcher::~CPCHScriptWrapper_Launcher()
{
Thread_Abort();
}
HRESULT CPCHScriptWrapper_Launcher::Run()
{
__HCP_FUNC_ENTRY( "CPCHScriptWrapper_Launcher::Run" );
HRESULT hr;
MPC::SmartLock<_ThreadModel> lock( this );
while(Thread_IsAborted() == false)
{
if(m_pCLSID)
{
(void)CreateEngine();
m_pCLSID = NULL;
Thread_SignalMain();
}
else
{
lock = NULL;
MPC::WaitForSingleObject( Thread_GetSignalEvent(), INFINITE );
lock = this;
}
}
hr = S_OK;
Thread_Abort(); // To tell the MPC:Thread object to close the worker thread...
__HCP_FUNC_EXIT(hr);
}
HRESULT CPCHScriptWrapper_Launcher::CreateEngine()
{
__HCP_FUNC_ENTRY( "CPCHScriptWrapper_Launcher::CreateEngine" );
HRESULT hr;
CComPtr<CPCHScriptWrapper_ServerSide> obj;
CComPtr<IUnknown> unk;
__MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &obj ));
__MPC_EXIT_IF_METHOD_FAILS(hr, obj->FinalConstructInner( m_pCLSID, m_bstrURL ));
__MPC_EXIT_IF_METHOD_FAILS(hr, obj.QueryInterface( &unk ));
m_engine = unk;
hr = S_OK;
__HCP_FUNC_CLEANUP;
m_hr = hr;
__HCP_FUNC_EXIT(hr);
}
HRESULT CPCHScriptWrapper_Launcher::CreateScriptWrapper( /*[in ]*/ REFCLSID rclsid ,
/*[in ]*/ BSTR bstrCode ,
/*[in ]*/ BSTR bstrURL ,
/*[out]*/ IUnknown* *ppObj )
{
__HCP_FUNC_ENTRY( "CPCHScriptWrapper_Launcher::CreateScriptWrapper" );
HRESULT hr;
MPC::SmartLock<_ThreadModel> lock( this );
__MPC_PARAMCHECK_BEGIN(hr)
__MPC_PARAMCHECK_POINTER_AND_SET(ppObj,NULL);
__MPC_PARAMCHECK_END();
if(Thread_IsRunning() == false &&
Thread_IsAborted() == false )
{
__MPC_EXIT_IF_METHOD_FAILS(hr, Thread_Start( this, Run, NULL ));
}
if(Thread_IsRunning())
{
CComPtr<IUnknown> unk;
m_pCLSID = &rclsid;
m_bstrURL = bstrURL;
Thread_Signal();
lock = NULL;
Thread_WaitNotificationFromWorker( INFINITE, /*fNoMessagePump*/true );
lock = this;
__MPC_EXIT_IF_METHOD_FAILS(hr, m_hr); // The real error code.
unk = m_engine; m_engine.Release();
*ppObj = unk.Detach();
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}