#include "stdafx.h" #pragma hdrstop #include "stdenum.h" #include #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 , public CComCoClass , public IObjectWithSiteImpl , public IDispatchImpl , public IConnectionPointContainerImpl , public IConnectionPointImpl , 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(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::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(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; }