windows-nt/Source/XPSP1/NT/shell/shell32/unicpp/sdmigwiz.cpp
2020-09-26 16:20:57 +08:00

223 lines
6.3 KiB
C++

#include "stdafx.h"
#pragma hdrstop
#include "stdenum.h"
#include <mshtmdid.h>
#include "shdispid.h"
/////////////////////////////////////////////
// Migration Wizard OOBE Automation Object //
/////////////////////////////////////////////
// This object handles automation calls from
// OOBE (Out Of Box Experience) and contains
// the Migration Wizard Engine located in migoobe.dll.
//
// Someday, this code will live inside of migoobe.dll,
// but we didn't have time to generate an entirely new
// typelib for migoobe.dll so we piggybacked on shell32's
// to make the development of the automation quicker to
// satisfy time constraints.
/////////////////////////////////////////////
// {E7562536-2D53-4f63-A749-84F7D4FC93E8}
extern "C" const CLSID CLSID_MigWizEngine =
{ 0xe7562536, 0x2d53, 0x4f63, { 0xa7, 0x49, 0x84, 0xf7, 0xd4, 0xfc, 0x93, 0xe8 } };
class ATL_NO_VTABLE CMigrationWizardAuto
: public CComObjectRootEx<CComSingleThreadModel>
, public CComCoClass<CMigrationWizardAuto, &CLSID_MigrationWizardAuto>
, public IObjectWithSiteImpl<CMigrationWizardAuto>
, public IDispatchImpl<IMigrationWizardAuto, &IID_IMigrationWizardAuto, &LIBID_Shell32>
, public IConnectionPointContainerImpl<CMigrationWizardAuto>
, public IConnectionPointImpl<CMigrationWizardAuto, &DIID_DMigrationWizardAutoEvents>
, public IProvideClassInfo2Impl<&CLSID_MigrationWizardAuto, &DIID_DMigrationWizardAutoEvents, &LIBID_Shell32>
// maybe , public IObjectWithSite
{
public:
CMigrationWizardAuto();
~CMigrationWizardAuto();
DECLARE_REGISTRY_RESOURCEID(IDR_MIGWIZAUTO)
DECLARE_NOT_AGGREGATABLE(CMigrationWizardAuto)
BEGIN_COM_MAP(CMigrationWizardAuto)
// ATL Uses these in IUnknown::QueryInterface()
COM_INTERFACE_ENTRY(IMigrationWizardAuto)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
COM_INTERFACE_ENTRY_IMPL(IObjectWithSite) // maybe nuke _IMPL
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CMigrationWizardAuto)
CONNECTION_POINT_ENTRY(DIID_DMigrationWizardAutoEvents)
END_CONNECTION_POINT_MAP()
// IObjectWithSite
STDMETHODIMP SetSite(IUnknown * punk);
// IDispatch
STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo, UINT * puArgErr);
STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo);
STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR **rgszNames, UINT cNames, LCID lcid, DISPID * rgdispid);
// IMigrationWizardAuto
STDMETHODIMP CreateToolDisk(BSTR pszDrivePath, BSTR pszFilesPath, BSTR pszManifest);
STDMETHODIMP ApplySettings(BSTR pszStore);
STDMETHODIMP Cancel();
protected:
HRESULT _InitInner(void);
// HRESULT _FireDebug();
private:
ITypeInfo* m_pTypeInfo;
IMigrationWizardAuto * m_pInner;
};
LCID g_lcidLocaleUnicppMigWiz = MAKELCID(LANG_USER_DEFAULT, SORT_DEFAULT);
STDAPI CMigrationWizardAuto_CreateInstance(IUnknown *punkOuter, REFIID riid, void **ppvOut)
{
return CComCreator< CComPolyObject< CMigrationWizardAuto > >::CreateInstance((void *) punkOuter, riid, ppvOut);
}
CMigrationWizardAuto::CMigrationWizardAuto() : m_pTypeInfo(NULL)
{
IID* pIID = (IID*)&IID_IMigrationWizardAuto;
GUID* pLIBID = (GUID*)&LIBID_Shell32;
WORD wMajor = 1;
WORD wMinor = 0;
ITypeLib* ptl = 0;
HRESULT hr = LoadRegTypeLib(*pLIBID, wMajor, wMinor, 0, &ptl);
m_pInner = NULL;
if (SUCCEEDED(hr))
{
hr = ptl->GetTypeInfoOfGuid(*pIID, &m_pTypeInfo);
ptl->Release();
}
DllAddRef();
}
CMigrationWizardAuto::~CMigrationWizardAuto()
{
ATOMICRELEASE(m_pInner);
if (m_pTypeInfo)
{
m_pTypeInfo->Release();
}
DllRelease();
}
HRESULT CMigrationWizardAuto::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** ppITypeInfo)
{
if (itinfo != 0)
{
return (*ppITypeInfo = 0), DISP_E_BADINDEX;
}
else
{
return (*ppITypeInfo = m_pTypeInfo)->AddRef(), S_OK;
}
}
HRESULT CMigrationWizardAuto::GetIDsOfNames(REFIID /*riid*/, LPOLESTR* rgszNames,
UINT cNames, LCID lcid, DISPID* rgdispid)
{
return m_pTypeInfo->GetIDsOfNames(rgszNames, cNames, rgdispid);
}
HRESULT CMigrationWizardAuto::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pdispparams,
VARIANT * pvarResult, EXCEPINFO * pexcepinfo, UINT * puArgErr)
{
return m_pTypeInfo->Invoke(static_cast<IMigrationWizardAuto*>(this),
dispidMember, wFlags, pdispparams, pvarResult,
pexcepinfo, puArgErr);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CMigrationWizardAuto::SetSite(IUnknown * punk)
{
if (m_pInner && !punk)
{
// Break back pointer
IUnknown_SetSite(m_pInner, NULL);
}
return IObjectWithSiteImpl<CMigrationWizardAuto>::SetSite(punk);
}
HRESULT CMigrationWizardAuto::_InitInner(void)
{
HRESULT hr = S_OK;
if (!m_pInner)
{
hr = CoCreateInstance(CLSID_MigWizEngine, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IMigrationWizardAuto, &m_pInner));
if (SUCCEEDED(hr))
{
IUnknown_SetSite(m_pInner, reinterpret_cast<IUnknown*>(this));
}
}
return hr;
}
STDMETHODIMP CMigrationWizardAuto::CreateToolDisk(BSTR pszDrivePath, BSTR pszFilesPath, BSTR pszManifest)
{
HRESULT hr = _InitInner();
if (SUCCEEDED(hr))
{
hr = m_pInner->CreateToolDisk(pszDrivePath, pszFilesPath, pszManifest);
// Done by inner
}
return hr;
}
STDMETHODIMP CMigrationWizardAuto::ApplySettings(BSTR pszStore)
{
HRESULT hr = _InitInner();
if (SUCCEEDED(hr))
{
hr = m_pInner->ApplySettings(pszStore);
// Done by inner
}
return hr;
}
STDMETHODIMP CMigrationWizardAuto::Cancel()
{
HRESULT hr = _InitInner();
if (SUCCEEDED(hr))
{
hr = m_pInner->Cancel();
// Done by inner
}
return hr;
}