223 lines
6.3 KiB
C++
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;
|
||
|
}
|
||
|
|