189 lines
5.4 KiB
C++
189 lines
5.4 KiB
C++
|
//
|
||
|
// SchmMgmt.cpp : Implementation of DLL Exports.
|
||
|
// Cory West
|
||
|
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "resource.h"
|
||
|
#include "initguid.h"
|
||
|
#include "schmmgmt.h"
|
||
|
#include "regkey.h" // AMC::CRegKey
|
||
|
#include "strings.h" // SNAPINS_KEY
|
||
|
#include "macros.h" // MFC_TRY/MFC_CATCH
|
||
|
#include "stdutils.h" // g_aNodetypeGuids
|
||
|
|
||
|
#include "cookie.h"
|
||
|
#include "compdata.h" // ComponentData
|
||
|
#include "about.h" // CSchemaMgmtAbout
|
||
|
|
||
|
USE_HANDLE_MACROS("SchmMgmt(SchmMgmt.cpp)")
|
||
|
|
||
|
|
||
|
|
||
|
// Snapin CLSID - {632cccf4-cbed-11d0-9c16-00c04fd8d86e}
|
||
|
const CLSID CLSID_SchmMgmt =
|
||
|
{0x632cccf4, 0xcbed, 0x11d0, {0x9c, 0x16, 0x00, 0xc0, 0x4f, 0xd8, 0xd8, 0x6e}};
|
||
|
|
||
|
// Snapin about CLSID - {333fe3fb-0a9d-11d1-bb10-00c04fc9a3a3}
|
||
|
const CLSID CLSID_SchemaManagementAbout =
|
||
|
{0x333fe3fb, 0x0a9d, 0x11d1, {0xbb, 0x10, 0x00, 0xc0, 0x4f, 0xc9, 0xa3, 0xa3}};
|
||
|
|
||
|
|
||
|
|
||
|
CComModule _Module;
|
||
|
|
||
|
BEGIN_OBJECT_MAP(ObjectMap)
|
||
|
OBJECT_ENTRY(CLSID_SchmMgmt, ComponentData)
|
||
|
OBJECT_ENTRY(CLSID_SchemaManagementAbout, CSchemaMgmtAbout)
|
||
|
END_OBJECT_MAP()
|
||
|
|
||
|
class CSchmMgmtApp : public CWinApp
|
||
|
{
|
||
|
public:
|
||
|
virtual BOOL InitInstance();
|
||
|
virtual int ExitInstance();
|
||
|
};
|
||
|
|
||
|
CSchmMgmtApp theApp;
|
||
|
|
||
|
BOOL CSchmMgmtApp::InitInstance()
|
||
|
{
|
||
|
_Module.Init(ObjectMap, m_hInstance);
|
||
|
return CWinApp::InitInstance();
|
||
|
}
|
||
|
|
||
|
int CSchmMgmtApp::ExitInstance()
|
||
|
{
|
||
|
_Module.Term();
|
||
|
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);
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// DllRegisterServer - Adds entries to the system registry
|
||
|
|
||
|
STDAPI DllRegisterServer( void ) {
|
||
|
|
||
|
MFC_TRY;
|
||
|
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
|
||
|
|
||
|
HRESULT hRes = S_OK;
|
||
|
CString Name, Microsoft, About, Provider, Version, VerString;
|
||
|
|
||
|
Name.LoadString(IDS_REGSERV_NAME);
|
||
|
Microsoft.LoadString(IDS_REGSERV_MICROSOFT);
|
||
|
About.LoadString(IDS_REGSERV_ABOUT);
|
||
|
Provider.LoadString(IDS_REGSERV_PROVIDER);
|
||
|
Version.LoadString(IDS_REGSERV_VERSION);
|
||
|
VerString.LoadString(IDS_SNAPINABOUT_VERSION);
|
||
|
|
||
|
//
|
||
|
// registers object, typelib and all interfaces in typelib
|
||
|
//
|
||
|
|
||
|
hRes = _Module.RegisterServer(FALSE);
|
||
|
|
||
|
try {
|
||
|
|
||
|
AMC::CRegKey regkeySnapins;
|
||
|
BOOL fFound = regkeySnapins.OpenKeyEx( HKEY_LOCAL_MACHINE, SNAPINS_KEY );
|
||
|
|
||
|
if ( !fFound ) {
|
||
|
|
||
|
ASSERT(FALSE);
|
||
|
return SELFREG_E_CLASS;
|
||
|
}
|
||
|
|
||
|
{
|
||
|
AMC::CRegKey regkeySchmMgmtSnapin;
|
||
|
CString strGUID;
|
||
|
|
||
|
HRESULT hr = GuidToCString(OUT &strGUID, CLSID_SchmMgmt );
|
||
|
|
||
|
if ( FAILED(hr) ) {
|
||
|
|
||
|
ASSERT(FALSE);
|
||
|
return SELFREG_E_CLASS;
|
||
|
}
|
||
|
|
||
|
regkeySchmMgmtSnapin.CreateKeyEx( regkeySnapins, strGUID );
|
||
|
regkeySchmMgmtSnapin.SetString( g_szNodeType, g_aNodetypeGuids[SCHMMGMT_SCHMMGMT].bstr );
|
||
|
regkeySchmMgmtSnapin.SetString( g_szNameString, Name );
|
||
|
|
||
|
hr = GuidToCString(OUT &strGUID, CLSID_SchemaManagementAbout );
|
||
|
|
||
|
if ( FAILED(hr) ) {
|
||
|
ASSERT(FALSE);
|
||
|
return SELFREG_E_CLASS;
|
||
|
}
|
||
|
|
||
|
regkeySchmMgmtSnapin.SetString( About, strGUID );
|
||
|
regkeySchmMgmtSnapin.SetString( Provider, Microsoft );
|
||
|
regkeySchmMgmtSnapin.SetString( Version, VerString );
|
||
|
AMC::CRegKey regkeySchmMgmtStandalone;
|
||
|
regkeySchmMgmtStandalone.CreateKeyEx( regkeySchmMgmtSnapin, g_szStandAlone );
|
||
|
AMC::CRegKey regkeyMyNodeTypes;
|
||
|
regkeyMyNodeTypes.CreateKeyEx( regkeySchmMgmtSnapin, g_szNodeTypes );
|
||
|
AMC::CRegKey regkeyMyNodeType;
|
||
|
|
||
|
for (int i = SCHMMGMT_SCHMMGMT; i < SCHMMGMT_NUMTYPES; i++)
|
||
|
{
|
||
|
regkeyMyNodeType.CreateKeyEx( regkeyMyNodeTypes, g_aNodetypeGuids[i].bstr );
|
||
|
regkeyMyNodeType.CloseKey();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
AMC::CRegKey regkeyNodeTypes;
|
||
|
fFound = regkeyNodeTypes.OpenKeyEx( HKEY_LOCAL_MACHINE, NODE_TYPES_KEY );
|
||
|
if ( !fFound )
|
||
|
{
|
||
|
ASSERT(FALSE);
|
||
|
return SELFREG_E_CLASS;
|
||
|
}
|
||
|
AMC::CRegKey regkeyNodeType;
|
||
|
for (int i = SCHMMGMT_SCHMMGMT; i < SCHMMGMT_NUMTYPES; i++)
|
||
|
{
|
||
|
regkeyNodeType.CreateKeyEx( regkeyNodeTypes, g_aNodetypeGuids[i].bstr );
|
||
|
regkeyNodeType.CloseKey();
|
||
|
}
|
||
|
}
|
||
|
catch (COleException* e)
|
||
|
{
|
||
|
ASSERT(FALSE);
|
||
|
e->Delete();
|
||
|
return SELFREG_E_CLASS;
|
||
|
}
|
||
|
|
||
|
return hRes;
|
||
|
|
||
|
MFC_CATCH;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// DllUnregisterServer - Removes entries from the system registry
|
||
|
|
||
|
STDAPI DllUnregisterServer(void)
|
||
|
{
|
||
|
_Module.UnregisterServer();
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|