570 lines
18 KiB
C++
570 lines
18 KiB
C++
//+--------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1994 - 1997.
|
|
//
|
|
// File: snapin.cpp
|
|
//
|
|
// Contents: DLL support routines, class factory and registration
|
|
// functions.
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions:
|
|
//
|
|
// History: 2-12-1998 stevebl comment header added
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
#include "precomp.hxx"
|
|
#include "initguid.h"
|
|
#include "gpedit.h"
|
|
|
|
extern const CLSID CLSID_Snapin = {0xBACF5C8A,0xA3C7,0x11D1,{0xA7,0x60,0x00,0xC0,0x4F,0xB9,0x60,0x3F}};
|
|
extern const wchar_t * szCLSID_Snapin = L"{BACF5C8A-A3C7-11D1-A760-00C04FB9603F}";
|
|
extern const CLSID CLSID_MachineSnapin = {0x942A8E4F,0xA261,0x11D1,{0xA7,0x60,0x00,0xc0,0x4f,0xb9,0x60,0x3f}};
|
|
extern const wchar_t * szCLSID_MachineSnapin = L"{942A8E4F-A261-11D1-A760-00C04FB9603F}";
|
|
|
|
// Main NodeType GUID on numeric format
|
|
extern const GUID cNodeType = {0xF8B3A900,0X8EA5,0X11D0,{0X8D,0X3C,0X00,0XA0,0XC9,0X0D,0XCA,0XE7}};
|
|
|
|
// Main NodeType GUID on string format
|
|
extern const wchar_t* cszNodeType = L"{F8B3A900-8EA5-11D0-8D3C-00A0C90DCAE7}";
|
|
|
|
// No public place for this now, real def is in gina\gpext\appmgmt\cs.idl.
|
|
extern const IID IID_IClassAdmin = {0x00000191,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
|
|
|
|
// RSOP flavors:
|
|
|
|
extern const CLSID CLSID_RSOP_Snapin = {
|
|
0x1bc972d6,
|
|
0x555c,
|
|
0x4ff7,
|
|
{0xbe, 0x2c, 0xc5, 0x84, 0x02, 0x1a, 0x0a, 0x6a}};
|
|
extern const wchar_t * szCLSID_RSOP_Snapin = L"{1BC972D6-555C-4FF7-BE2C-C584021A0A6A}";
|
|
extern const CLSID CLSID_RSOP_MachineSnapin = {
|
|
0x7e45546f,
|
|
0x6d52,
|
|
0x4d10,
|
|
{0xb7, 0x02, 0x9c, 0x2e, 0x67, 0x23, 0x2e, 0x62}};
|
|
extern const wchar_t * szCLSID_RSOP_MachineSnapin = L"{7E45546F-6D52-4D10-B702-9C2E67232E62}";
|
|
|
|
#include "safereg.hxx"
|
|
|
|
#define BREAK_ON_FAIL_HRESULT(hr) if (FAILED(hr)) break
|
|
|
|
#define PSBUFFER_STR L"AppManagementBuffer"
|
|
#define THREADING_STR L"Apartment"
|
|
|
|
HRESULT
|
|
RegisterInterface(
|
|
CSafeReg *pshkInterface,
|
|
LPWSTR wszInterfaceGUID,
|
|
LPWSTR wszInterfaceName,
|
|
LPWSTR wszNumMethods,
|
|
LPWSTR wszProxyCLSID);
|
|
|
|
CComModule _Module;
|
|
|
|
BEGIN_OBJECT_MAP(ObjectMap)
|
|
OBJECT_ENTRY(CLSID_Snapin, CUserComponentDataImpl)
|
|
OBJECT_ENTRY(CLSID_MachineSnapin, CMachineComponentDataImpl)
|
|
OBJECT_ENTRY(CLSID_RSOP_Snapin, CRSOPUserComponentDataImpl)
|
|
OBJECT_ENTRY(CLSID_RSOP_MachineSnapin, CRSOPMachineComponentDataImpl)
|
|
END_OBJECT_MAP()
|
|
|
|
CLSID CLSID_Temp;
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
class CSnapinApp : public CWinApp
|
|
{
|
|
public:
|
|
virtual BOOL InitInstance();
|
|
virtual int ExitInstance();
|
|
};
|
|
|
|
CSnapinApp theApp;
|
|
|
|
HINSTANCE ghInstance;
|
|
|
|
BOOL CSnapinApp::InitInstance()
|
|
{
|
|
ghInstance = m_hInstance;
|
|
_Module.Init(ObjectMap, m_hInstance);
|
|
// CoGetMalloc(1, &g_pIMalloc);
|
|
#if DBG
|
|
InitDebugSupport();
|
|
#endif
|
|
// Add theme'ing support
|
|
SHFusionInitializeFromModuleID (m_hInstance, 2);
|
|
|
|
return CWinApp::InitInstance();
|
|
}
|
|
|
|
int CSnapinApp::ExitInstance()
|
|
{
|
|
_Module.Term();
|
|
|
|
DEBUG_VERIFY_INSTANCE_COUNT(CResultPane);
|
|
DEBUG_VERIFY_INSTANCE_COUNT(CScopePane);
|
|
|
|
// Cleanup required by fusion support
|
|
SHFusionUninitialize();
|
|
|
|
// g_pIMalloc->Release();
|
|
return CWinApp::ExitInstance();
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Used to determine whether the DLL can be unloaded by OLE
|
|
|
|
STDAPI DllCanUnloadNow(void)
|
|
{
|
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
|
return (AfxDllCanUnloadNow()==S_OK && _Module.GetLockCount()==0) ? S_OK : S_FALSE;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Returns a class factory to create an object of the requested type
|
|
|
|
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
|
|
{
|
|
return _Module.GetClassObject(rclsid, riid, ppv);
|
|
}
|
|
|
|
const wchar_t * szUser_Namespace = L"{59849DF9-A256-11D1-A760-00C04FB9603F}";
|
|
const wchar_t * szMachine_Namespace = L"{4D53F093-A260-11D1-A760-00C04FB9603F}";
|
|
const wchar_t * szMachineAppName = L"Software Installation (Computers)";
|
|
const wchar_t * szUserAppName = L"Software Installation (Users)";
|
|
const wchar_t * szUser_RSOP_Namespace = L"{9D5EB218-8EA3-4EE9-B120-52FC68C8D128}";
|
|
const wchar_t * szMachine_RSOP_Namespace = L"{DFA38559-8B35-42EF-8B00-E8F6CBF99BC0}";
|
|
|
|
const wchar_t * szUserAppNameIndirect = L"@appmgr.dll,-50";
|
|
const wchar_t * szMachineAppNameIndirect = L"@appmgr.dll,-51";
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DllRegisterServer - Adds entries to the system registry
|
|
|
|
STDAPI DllRegisterServer(void)
|
|
{
|
|
CSafeReg shk;
|
|
CSafeReg shkCLSID;
|
|
CSafeReg shkServer;
|
|
CSafeReg shkTemp;
|
|
HRESULT hr = S_OK;
|
|
|
|
do
|
|
{
|
|
CLSID_Temp = CLSID_Snapin;
|
|
hr = _Module.RegisterServer(FALSE);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
// register extension
|
|
hr = shkCLSID.Open(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\SnapIns", KEY_WRITE);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
|
|
hr = shkCLSID.Create(szCLSID_Snapin, &shk);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shk.SetValue(L"NameString",
|
|
REG_SZ,
|
|
(CONST BYTE *) szUserAppName,
|
|
sizeof(WCHAR) * (lstrlen(szUserAppName)+ 1));
|
|
|
|
hr = shk.SetValue(L"NameStringIndirect",
|
|
REG_SZ,
|
|
(CONST BYTE *) szUserAppNameIndirect,
|
|
sizeof(WCHAR) * (lstrlen(szUserAppNameIndirect)+ 1));
|
|
|
|
hr = shk.Create(L"NodeTypes", &shkTemp);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkTemp.Create(szUser_Namespace, &shkServer);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
shkServer.Close();
|
|
shkTemp.Close();
|
|
shk.Close();
|
|
|
|
hr = shkCLSID.Create(szCLSID_MachineSnapin, &shk);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shk.SetValue(L"NameString",
|
|
REG_SZ,
|
|
(CONST BYTE *) szMachineAppName,
|
|
sizeof(WCHAR) * (lstrlen(szMachineAppName)+ 1));
|
|
|
|
hr = shk.SetValue(L"NameStringIndirect",
|
|
REG_SZ,
|
|
(CONST BYTE *) szMachineAppNameIndirect,
|
|
sizeof(WCHAR) * (lstrlen(szMachineAppNameIndirect)+ 1));
|
|
|
|
hr = shk.Create(L"NodeTypes", &shkTemp);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkTemp.Create(szMachine_Namespace, &shkServer);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
shkServer.Close();
|
|
shkTemp.Close();
|
|
shk.Close();
|
|
shkCLSID.Close();
|
|
|
|
hr = shkCLSID.Open(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\NodeTypes", KEY_WRITE);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkCLSID.Create(szUser_Namespace, &shk);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
shk.Close();
|
|
|
|
hr = shkCLSID.Create(szMachine_Namespace, &shk);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
shk.Close();
|
|
|
|
WCHAR szGUID[50];
|
|
StringFromGUID2 (NODEID_UserSWSettings, szGUID, 50);
|
|
|
|
hr = shkCLSID.Create(szGUID, &shk);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shk.Create(L"Extensions", &shkServer);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkServer.Create(L"NameSpace", &shkTemp);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkTemp.SetValue(szCLSID_Snapin,
|
|
REG_SZ,
|
|
(CONST BYTE *) szUserAppName,
|
|
sizeof(WCHAR) * (lstrlen(szUserAppName)+ 1));
|
|
shkTemp.Close();
|
|
shkServer.Close();
|
|
shk.Close();
|
|
|
|
StringFromGUID2 (NODEID_MachineSWSettings, szGUID, 50);
|
|
|
|
hr = shkCLSID.Create(szGUID, &shk);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shk.Create(L"Extensions", &shkServer);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkServer.Create(L"NameSpace", &shkTemp);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkTemp.SetValue(szCLSID_MachineSnapin,
|
|
REG_SZ,
|
|
(CONST BYTE *) szMachineAppName,
|
|
sizeof(WCHAR) * (lstrlen(szMachineAppName)+ 1));
|
|
shkTemp.Close();
|
|
shkServer.Close();
|
|
shk.Close();
|
|
shkCLSID.Close();
|
|
|
|
|
|
//
|
|
// RSOP versions
|
|
//
|
|
|
|
CLSID_Temp = CLSID_RSOP_Snapin;
|
|
hr = _Module.RegisterServer(FALSE);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
// register extension
|
|
hr = shkCLSID.Open(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\SnapIns", KEY_WRITE);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
|
|
hr = shkCLSID.Create(szCLSID_RSOP_Snapin, &shk);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shk.SetValue(L"NameString",
|
|
REG_SZ,
|
|
(CONST BYTE *) szUserAppName,
|
|
sizeof(WCHAR) * (lstrlen(szUserAppName)+ 1));
|
|
|
|
hr = shk.SetValue(L"NameStringIndirect",
|
|
REG_SZ,
|
|
(CONST BYTE *) szUserAppNameIndirect,
|
|
sizeof(WCHAR) * (lstrlen(szUserAppNameIndirect)+ 1));
|
|
|
|
hr = shk.Create(L"NodeTypes", &shkTemp);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkTemp.Create(szUser_RSOP_Namespace, &shkServer);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
shkServer.Close();
|
|
shkTemp.Close();
|
|
shk.Close();
|
|
|
|
hr = shkCLSID.Create(szCLSID_RSOP_MachineSnapin, &shk);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shk.SetValue(L"NameString",
|
|
REG_SZ,
|
|
(CONST BYTE *) szMachineAppName,
|
|
sizeof(WCHAR) * (lstrlen(szMachineAppName)+ 1));
|
|
|
|
hr = shk.SetValue(L"NameStringIndirect",
|
|
REG_SZ,
|
|
(CONST BYTE *) szMachineAppNameIndirect,
|
|
sizeof(WCHAR) * (lstrlen(szMachineAppNameIndirect)+ 1));
|
|
|
|
hr = shk.Create(L"NodeTypes", &shkTemp);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkTemp.Create(szMachine_RSOP_Namespace, &shkServer);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
shkServer.Close();
|
|
shkTemp.Close();
|
|
shk.Close();
|
|
shkCLSID.Close();
|
|
|
|
hr = shkCLSID.Open(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\NodeTypes", KEY_WRITE);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkCLSID.Create(szUser_RSOP_Namespace, &shk);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
shk.Close();
|
|
|
|
hr = shkCLSID.Create(szMachine_RSOP_Namespace, &shk);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
shk.Close();
|
|
|
|
StringFromGUID2 (NODEID_RSOPUserSWSettings, szGUID, 50);
|
|
|
|
hr = shkCLSID.Create(szGUID, &shk);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shk.Create(L"Extensions", &shkServer);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkServer.Create(L"NameSpace", &shkTemp);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkTemp.SetValue(szCLSID_RSOP_Snapin,
|
|
REG_SZ,
|
|
(CONST BYTE *) szUserAppName,
|
|
sizeof(WCHAR) * (lstrlen(szUserAppName)+ 1));
|
|
shkTemp.Close();
|
|
shkServer.Close();
|
|
shk.Close();
|
|
|
|
StringFromGUID2 (NODEID_RSOPMachineSWSettings, szGUID, 50);
|
|
|
|
hr = shkCLSID.Create(szGUID, &shk);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shk.Create(L"Extensions", &shkServer);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkServer.Create(L"NameSpace", &shkTemp);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkTemp.SetValue(szCLSID_RSOP_MachineSnapin,
|
|
REG_SZ,
|
|
(CONST BYTE *) szMachineAppName,
|
|
sizeof(WCHAR) * (lstrlen(szMachineAppName)+ 1));
|
|
shkTemp.Close();
|
|
shkServer.Close();
|
|
shk.Close();
|
|
shkCLSID.Close();
|
|
|
|
|
|
hr = shkCLSID.Open(HKEY_CLASSES_ROOT, L"CLSID", KEY_WRITE);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
} while (0);
|
|
|
|
return hr;
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DllUnregisterServer - Removes entries from the system registry
|
|
|
|
STDAPI DllUnregisterServer(void)
|
|
{
|
|
CLSID_Temp = CLSID_Snapin;
|
|
_Module.UnregisterServer();
|
|
|
|
HKEY hkey;
|
|
CString sz;
|
|
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\SnapIns\\", 0, KEY_WRITE, &hkey);
|
|
if (hkey)
|
|
{
|
|
RegDeleteTree(hkey, (LPOLESTR)((LPCOLESTR)szCLSID_Snapin));
|
|
RegCloseKey(hkey);
|
|
}
|
|
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\NodeTypes\\", 0, KEY_WRITE, &hkey);
|
|
if (hkey)
|
|
{
|
|
RegDeleteTree(HKEY_LOCAL_MACHINE, (LPOLESTR)((LPCOLESTR)szUser_Namespace));
|
|
RegCloseKey(hkey);
|
|
}
|
|
WCHAR szGUID[50];
|
|
sz = L"Software\\Microsoft\\MMC\\NodeTypes\\";
|
|
StringFromGUID2 (NODEID_UserSWSettings, szGUID, 50);
|
|
sz += szGUID;
|
|
sz += L"\\Extensions\\NameSpace";
|
|
RegOpenKeyEx(HKEY_LOCAL_MACHINE, sz, 0, KEY_WRITE, &hkey);
|
|
if (hkey)
|
|
{
|
|
RegDeleteValue(hkey, szCLSID_Snapin);
|
|
RegCloseKey(hkey);
|
|
}
|
|
|
|
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\SnapIns\\", 0, KEY_WRITE, &hkey);
|
|
if (hkey)
|
|
{
|
|
RegDeleteTree(hkey, (LPOLESTR)((LPCOLESTR)szCLSID_MachineSnapin));
|
|
RegCloseKey(hkey);
|
|
}
|
|
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\NodeTypes\\", 0, KEY_WRITE, &hkey);
|
|
if (hkey)
|
|
{
|
|
RegDeleteTree(HKEY_LOCAL_MACHINE, (LPOLESTR)((LPCOLESTR)szMachine_Namespace));
|
|
RegCloseKey(hkey);
|
|
}
|
|
sz = L"Software\\Microsoft\\MMC\\NodeTypes\\";
|
|
StringFromGUID2 (NODEID_MachineSWSettings, szGUID, 50);
|
|
sz += szGUID;
|
|
sz += L"\\Extensions\\NameSpace";
|
|
RegOpenKeyEx(HKEY_LOCAL_MACHINE, sz, 0, KEY_WRITE, &hkey);
|
|
if (hkey)
|
|
{
|
|
RegDeleteValue(hkey, szCLSID_MachineSnapin);
|
|
RegCloseKey(hkey);
|
|
}
|
|
|
|
//
|
|
// RSOP versions
|
|
//
|
|
|
|
CLSID_Temp = CLSID_RSOP_Snapin;
|
|
_Module.UnregisterServer();
|
|
|
|
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\SnapIns\\", 0, KEY_WRITE, &hkey);
|
|
if (hkey)
|
|
{
|
|
RegDeleteTree(hkey, (LPOLESTR)((LPCOLESTR)szCLSID_RSOP_Snapin));
|
|
RegCloseKey(hkey);
|
|
}
|
|
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\NodeTypes\\", 0, KEY_WRITE, &hkey);
|
|
if (hkey)
|
|
{
|
|
RegDeleteTree(HKEY_LOCAL_MACHINE, (LPOLESTR)((LPCOLESTR)szUser_RSOP_Namespace));
|
|
RegCloseKey(hkey);
|
|
}
|
|
sz = L"Software\\Microsoft\\MMC\\NodeTypes\\";
|
|
StringFromGUID2 (NODEID_RSOPUserSWSettings, szGUID, 50);
|
|
sz += szGUID;
|
|
sz += L"\\Extensions\\NameSpace";
|
|
RegOpenKeyEx(HKEY_LOCAL_MACHINE, sz, 0, KEY_WRITE, &hkey);
|
|
if (hkey)
|
|
{
|
|
RegDeleteValue(hkey, szCLSID_Snapin);
|
|
RegCloseKey(hkey);
|
|
}
|
|
|
|
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\SnapIns\\", 0, KEY_WRITE, &hkey);
|
|
if (hkey)
|
|
{
|
|
RegDeleteTree(hkey, (LPOLESTR)((LPCOLESTR)szCLSID_RSOP_MachineSnapin));
|
|
RegCloseKey(hkey);
|
|
}
|
|
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\MMC\\NodeTypes\\", 0, KEY_WRITE, &hkey);
|
|
if (hkey)
|
|
{
|
|
RegDeleteTree(HKEY_LOCAL_MACHINE, (LPOLESTR)((LPCOLESTR)szMachine_Namespace));
|
|
RegCloseKey(hkey);
|
|
}
|
|
sz = L"Software\\Microsoft\\MMC\\NodeTypes\\";
|
|
StringFromGUID2 (NODEID_RSOPMachineSWSettings, szGUID, 50);
|
|
sz += szGUID;
|
|
sz += L"\\Extensions\\NameSpace";
|
|
RegOpenKeyEx(HKEY_LOCAL_MACHINE, sz, 0, KEY_WRITE, &hkey);
|
|
if (hkey)
|
|
{
|
|
RegDeleteValue(hkey, szCLSID_RSOP_MachineSnapin);
|
|
RegCloseKey(hkey);
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Function: RegisterInterface
|
|
//
|
|
// Synopsis: Add the registry entries required for an interface.
|
|
//
|
|
// Arguments: [pshkInterface] - handle to CLSID\Interface key
|
|
// [wszInterfaceGUID] - GUID of interface to add
|
|
// [wszInterfaceName] - human-readable name of interface
|
|
// [wszNumMethods] - number of methods (including inherited)
|
|
// [wszProxyCLSID] - GUID of dll containing proxy/stubs
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// History: 3-31-1997 DavidMun Created
|
|
// 5-09-1997 SteveBl Modified for use with AppMgr
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
RegisterInterface(
|
|
CSafeReg *pshkInterface,
|
|
LPWSTR wszInterfaceGUID,
|
|
LPWSTR wszInterfaceName,
|
|
LPWSTR wszNumMethods,
|
|
LPWSTR wszProxyCLSID)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
CSafeReg shkIID;
|
|
CSafeReg shkNumMethods;
|
|
CSafeReg shkProxy;
|
|
|
|
do
|
|
{
|
|
hr = pshkInterface->Create(wszInterfaceGUID, &shkIID);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkIID.SetValue(NULL,
|
|
REG_SZ,
|
|
(CONST BYTE *) wszInterfaceName,
|
|
sizeof(WCHAR) * (lstrlen(wszInterfaceName) + 1));
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkIID.Create(L"NumMethods", &shkNumMethods);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkNumMethods.SetValue(NULL,
|
|
REG_SZ,
|
|
(CONST BYTE *)wszNumMethods,
|
|
sizeof(WCHAR) * (lstrlen(wszNumMethods) + 1));
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkIID.Create(L"ProxyStubClsid32", &shkProxy);
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
|
|
hr = shkProxy.SetValue(NULL,
|
|
REG_SZ,
|
|
(CONST BYTE *)wszProxyCLSID,
|
|
sizeof(WCHAR) * (lstrlen(wszProxyCLSID) + 1));
|
|
BREAK_ON_FAIL_HRESULT(hr);
|
|
} while (0);
|
|
|
|
return hr;
|
|
}
|