151 lines
7.3 KiB
C++
151 lines
7.3 KiB
C++
|
/*--------------------------------------------------------------------------*
|
||
|
*
|
||
|
* Microsoft Windows
|
||
|
* Copyright (C) Microsoft Corporation, 1992 - 000
|
||
|
*
|
||
|
* File: extension.cpp
|
||
|
*
|
||
|
* Contents:
|
||
|
*
|
||
|
* History: 13-Mar-2000 jeffro Created
|
||
|
*
|
||
|
*--------------------------------------------------------------------------*/
|
||
|
|
||
|
#include "stdafx.hxx"
|
||
|
#include "Extension.h"
|
||
|
|
||
|
|
||
|
static const WCHAR szRegistrationScript[] =
|
||
|
L"HKCR" L"\n"
|
||
|
L"{" L"\n"
|
||
|
L" %VProgID% = s '%VClassName%'" L"\n"
|
||
|
L" {" L"\n"
|
||
|
L" CLSID = s '%VCLSID%'" L"\n"
|
||
|
L" }" L"\n"
|
||
|
L" %VVersionIndependentProgID% = s '%VClassName%'" L"\n"
|
||
|
L" {" L"\n"
|
||
|
L" CurVer = s '%VProgID%'" L"\n"
|
||
|
L" }" L"\n"
|
||
|
L" NoRemove CLSID" L"\n"
|
||
|
L" {" L"\n"
|
||
|
L" ForceRemove %VCLSID% = s '%VClassName%'" L"\n"
|
||
|
L" {" L"\n"
|
||
|
L" ProgID = s '%VProgID%'" L"\n"
|
||
|
L" VersionIndependentProgID = s '%VVersionIndependentProgID%'" L"\n"
|
||
|
L" InprocServer32 = s '%VModule%'" L"\n"
|
||
|
L" {" L"\n"
|
||
|
L" val ThreadingModel = s 'Apartment'" L"\n"
|
||
|
L" }" L"\n"
|
||
|
L" }" L"\n"
|
||
|
L" }" L"\n"
|
||
|
L"}" L"\n"
|
||
|
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" }" L"\n"
|
||
|
L" }" L"\n"
|
||
|
L" NoRemove NodeTypes" L"\n"
|
||
|
L" {" L"\n"
|
||
|
L" NoRemove %VExtendedNodeType%" L"\n"
|
||
|
L" {" L"\n"
|
||
|
L" NoRemove Extensions" L"\n"
|
||
|
L" {" L"\n"
|
||
|
L" NoRemove %VExtensionType%" L"\n"
|
||
|
L" {" L"\n"
|
||
|
L" val %VCLSID% = s '%VClassName%'" L"\n"
|
||
|
L" }" L"\n"
|
||
|
L" }" L"\n"
|
||
|
L" }" L"\n"
|
||
|
L" }" L"\n"
|
||
|
L" }" L"\n"
|
||
|
L" }" L"\n"
|
||
|
L" }" L"\n"
|
||
|
L"}";
|
||
|
|
||
|
|
||
|
/*+-------------------------------------------------------------------------*
|
||
|
* CExtension::UpdateRegistry
|
||
|
*
|
||
|
*
|
||
|
*--------------------------------------------------------------------------*/
|
||
|
|
||
|
HRESULT WINAPI CExtension::UpdateRegistry (
|
||
|
BOOL bRegister,
|
||
|
ExtensionType eExtType,
|
||
|
const CLSID& clsidSnapIn,
|
||
|
LPCWSTR pszClassName,
|
||
|
LPCWSTR pszProgID,
|
||
|
LPCWSTR pszVersionIndependentProgID,
|
||
|
LPCWSTR pszExtendedNodeType)
|
||
|
{
|
||
|
DECLARE_SC (sc, _T("CExtension::UpdateRegistry"));
|
||
|
|
||
|
if ((eExtType < eExtType_First) || (eExtType > eExtType_Last))
|
||
|
return ((sc = E_INVALIDARG).ToHr());
|
||
|
|
||
|
/*
|
||
|
* string-ify the CLSID
|
||
|
*/
|
||
|
CCoTaskMemPtr<WCHAR> spszClsid;
|
||
|
sc = StringFromCLSID (clsidSnapIn, &spszClsid);
|
||
|
if (sc)
|
||
|
return sc.ToHr();
|
||
|
|
||
|
static const LPCWSTR rgExtTypes[eExtType_Count] =
|
||
|
{
|
||
|
L"Namespace", // eExtType_Namespace
|
||
|
L"ContextMenu", // eExtType_ContextMenu
|
||
|
L"PropertySheet", // eExtType_PropertySheet
|
||
|
L"Taskpad", // eExtType_Taskpad
|
||
|
L"View", // eExtType_View
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* get the filename for the module
|
||
|
*/
|
||
|
USES_CONVERSION;
|
||
|
TCHAR szModule[_MAX_PATH];
|
||
|
GetModuleFileName (_Module.GetModuleInstance(), szModule, countof(szModule));
|
||
|
|
||
|
/*
|
||
|
* specify the standard object substitution parameters for CRegObject
|
||
|
*/
|
||
|
::ATL::ATL::CRegObject ro; // hack around nested namespace bug in ATL30
|
||
|
_ATL_REGMAP_ENTRY rgObjEntries[] =
|
||
|
{
|
||
|
{ L"VModule", T2W(szModule) },
|
||
|
{ L"VCLSID", spszClsid },
|
||
|
{ L"VExtendedNodeType", pszExtendedNodeType },
|
||
|
{ L"VClassName", pszClassName },
|
||
|
{ L"VProgID", pszProgID },
|
||
|
{ L"VVersionIndependentProgID", pszVersionIndependentProgID },
|
||
|
{ L"VExtensionType", rgExtTypes[eExtType] },
|
||
|
{ L"VSnapinName", pszClassName}
|
||
|
};
|
||
|
|
||
|
for (int i = 0; i < countof (rgObjEntries); i++)
|
||
|
{
|
||
|
sc = ro.AddReplacement (rgObjEntries[i].szKey, rgObjEntries[i].szData);
|
||
|
if (sc)
|
||
|
return (sc.ToHr());
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* (un)register!
|
||
|
*/
|
||
|
sc = (bRegister) ? ro.StringRegister (szRegistrationScript)
|
||
|
: ro.StringUnregister (szRegistrationScript);
|
||
|
|
||
|
return sc.ToHr();
|
||
|
}
|