/*--------------------------------------------------------------------------* * * Microsoft Windows * Copyright (C) Microsoft Corporation, 2000 - 2000 * * File: viewext.cpp * * Contents: Implementation file for the built-in view extension snapin that extends * the snapins that ship with windows. * * History: 21 March 2000 vivekj Created * *--------------------------------------------------------------------------*/ #include "stdafx.h" #include "viewext.h" #include "util.h" #include "fldrsnap.h" // for ScFormatIndirectSnapInName // {B708457E-DB61-4c55-A92F-0D4B5E9B1224} const CLSID CLSID_ViewExtSnapin = { 0xb708457e, 0xdb61, 0x4c55, { 0xa9, 0x2f, 0xd, 0x4b, 0x5e, 0x9b, 0x12, 0x24 } }; const GUID GUID_ExplorerView = { 0x34723cbb, 0x9676, 0x4770, { 0xa8, 0xdf, 0x60, 0x8, 0x8, 0x53, 0x47, 0x7a } }; #ifdef DBG CTraceTag tagVivekHardCodedViewExtPath(_T("Vivek"), _T("Use view extension d:\\views.htm")); CTraceTag tagDllRegistration (_T("MMC Dll Registration"), _T("View extension registration")); #endif /*+-------------------------------------------------------------------------* * * CViewExtensionSnapin::GetViews * * PURPOSE: Returns the URL for the extended view. * * PARAMETERS: * LPDATAOBJECT pDataObject : * LPVIEWEXTENSIONCALLBACK pViewExtensionCallback: The callback to add the views into * * RETURNS: * HRESULT * *+-------------------------------------------------------------------------*/ HRESULT CViewExtensionSnapin::GetViews(LPDATAOBJECT pDataObject, LPVIEWEXTENSIONCALLBACK pViewExtensionCallback) { DECLARE_SC(sc, TEXT("CViewExtensionSnapin::GetView")); // check parameters sc = ScCheckPointers(pDataObject, pViewExtensionCallback, E_UNEXPECTED); if(sc) return sc.ToHr(); MMC_EXT_VIEW_DATA extViewData = {0}; USES_CONVERSION; TCHAR szBuffer[MAX_PATH * 2]; #ifdef DBG if (tagVivekHardCodedViewExtPath.FAny()) // use the hard coded path to make changes easier. { sc = StringCchCopy(szBuffer, countof(szBuffer), _T("d:\\newnt\\admin\\mmcdev\\nodemgr\\viewext\\views.htm")); if(sc) return sc.ToHr(); } else { #endif // DBG // get the fully qualified path to the dll and append the html page sc = StringCchCopy(szBuffer, countof(szBuffer), _T("res://")); if(sc) return sc.ToHr(); DWORD dwRet = ::GetModuleFileName (_Module.GetModuleInstance(), szBuffer + _tcslen(szBuffer), countof(szBuffer) - _tcslen(szBuffer)); if(0==dwRet) return (sc.FromLastError().ToHr()); sc = StringCchCat(szBuffer, countof(szBuffer), _T("/views.htm")); if(sc) return sc.ToHr(); #ifdef DBG } #endif // DBG extViewData.pszURL = T2OLE(szBuffer); // set the GUID identifier of the view extViewData.viewID = GUID_ExplorerView; // set the title for the string. CStr strViewTitle; strViewTitle.LoadString(GetStringModule(), IDS_ExplorerView); // the name of the view extViewData.pszViewTitle = T2COLE(strViewTitle); // does not replace the normal view extViewData.bReplacesDefaultView = FALSE; sc = pViewExtensionCallback->AddView(&extViewData); return sc.ToHr(); } /*+-------------------------------------------------------------------------* * szViewExtRegScript * * Registration script used by RegisterViewExtension. *--------------------------------------------------------------------------*/ static const WCHAR szViewExtRegScript[] = L"HKLM" L"\n" L"{" L"\n" L" NoRemove Software" L"\n" L" {" L"\n" L" NoRemove Microsoft" L"\n" L" {" L"\n" L" NoRemove MMC" L"\n" L" {" L"\n" L" NoRemove SnapIns" L"\n" L" {" L"\n" L" ForceRemove %VCLSID%" L"\n" L" {" L"\n" L" val NameString = s '%VSnapinName%'" L"\n" L" val NameStringIndirect = s '%VSnapinNameIndirect%'" L"\n" L" }" L"\n" L" }" L"\n" L" }" L"\n" L" }" L"\n" L" }" L"\n" L"}"; /*+-------------------------------------------------------------------------* * RegisterViewExtension * * Note1: registers mmcndmgr.dll as the module without any path. * * Note2: Snapin registration does not include nodetypes/about/version... * *--------------------------------------------------------------------------*/ HRESULT WINAPI RegisterViewExtension (BOOL bRegister, CObjectRegParams& rObjParams, int idSnapinName) { DECLARE_SC (sc, _T("RegisterViewExtension")); // First register the com object for this inproc server. sc = MMCUpdateRegistry (bRegister, &rObjParams, NULL); if (sc) return sc.ToHr(); /* * string-ify the CLSID */ CCoTaskMemPtr spszClsid; sc = StringFromCLSID (rObjParams.m_clsid, &spszClsid); if (sc) return sc.ToHr(); /* * load the default snap-in name */ HINSTANCE hInst = GetStringModule(); CStr strSnapinName; strSnapinName.LoadString (hInst, idSnapinName); /* * format a MUI-friendly snap-in name */ CStr strSnapinNameIndirect; sc = ScFormatIndirectSnapInName (hInst, idSnapinName, strSnapinNameIndirect); if (sc) return (sc.ToHr()); USES_CONVERSION; #ifdef DBG extern CTraceTag tagDllRegistration; std::wstring strReplacements; #endif #ifdef _ATL_NAMESPACE_BUG_FIXED ::ATL::CRegObject ro; // hack around nested namespace bug in ATL30 #else MMC_ATL::ATL::CRegObject ro; // hack around nested namespace bug in ATL30 #endif _ATL_REGMAP_ENTRY rgExtensionEntries[] = { { L"VCLSID", spszClsid }, { L"VSnapinName", T2CW (strSnapinName) }, { L"VSnapinNameIndirect", T2CW (strSnapinNameIndirect) }, { L"VClassName", rObjParams.m_strClassName.data() }, { L"VProgID", rObjParams.m_strProgID.data() }, { L"VVersionIndependentProgID", rObjParams.m_strVersionIndependentProgID.data() }, }; for (int j = 0; j < countof (rgExtensionEntries); j++) { sc = ro.AddReplacement (rgExtensionEntries[j].szKey, rgExtensionEntries[j].szData); if (sc) return (sc.ToHr()); AddReplacementTrace (strReplacements, rgExtensionEntries[j].szKey, rgExtensionEntries[j].szData); } Trace (tagDllRegistration, _T("Registration script:\n%s"), W2CT(szViewExtRegScript)); Trace (tagDllRegistration, W2CT(strReplacements.data())); /* * (un)register! */ sc = (bRegister) ? ro.StringRegister (szViewExtRegScript) : ro.StringUnregister (szViewExtRegScript); if (sc) return sc.ToHr(); return sc.ToHr(); }