|
|
// MyComput.cpp : Implementation of DLL Exports.
#include "stdafx.h"
#include "resource.h"
#include "initguid.h"
#include "MyComput.h"
#include "regkey.h" // AMC::CRegKey
#include "strings.h" // SNAPINS_KEY
#include "guidhelp.h" // GuidToCString
#include "macros.h" // MFC_TRY/MFC_CATCH
#include "stdutils.h" // g_aNodetypeGuids
#include "MyComput_i.c"
#include "about.h" // CComputerMgmtAbout
#include "compdata.h" // CMyComputerComponentData
#include "snapreg.h" // RegisterSnapin
USE_HANDLE_MACROS("MYCOMPUT(MyComput.cpp)") \
CComModule _Module;
BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_MyComputer, CMyComputerComponentData) OBJECT_ENTRY(CLSID_ComputerManagementAbout, CComputerMgmtAbout) END_OBJECT_MAP()
class CMyComputApp : public CWinApp { public: virtual BOOL InitInstance(); virtual int ExitInstance(); };
CMyComputApp theApp;
BOOL CMyComputApp::InitInstance() { _Module.Init(ObjectMap, m_hInstance); return CWinApp::InitInstance(); }
int CMyComputApp::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;
HRESULT hr = S_OK; // registers object, typelib and all interfaces in typelib
hr = _Module.RegisterServer(TRUE);
CString strMyComputerCLSID, strMyComputerAboutCLSID; if ( FAILED(hr = GuidToCString( &strMyComputerCLSID, CLSID_MyComputer )) || FAILED(hr = GuidToCString( &strMyComputerAboutCLSID, CLSID_ComputerManagementAbout )) ) { ASSERT(FALSE && "GuidToCString() failure"); return SELFREG_E_CLASS; }
try { AMC::CRegKey regkeySnapins; BOOL fFound = regkeySnapins.OpenKeyEx( HKEY_LOCAL_MACHINE, SNAPINS_KEY ); if ( !fFound ) { ASSERT(FALSE && "DllRegisterServer() - Unable to open key from registry."); return SELFREG_E_CLASS; }
static int mycomput_types[4] = { MYCOMPUT_COMPUTER, MYCOMPUT_SYSTEMTOOLS, MYCOMPUT_SERVERAPPS, MYCOMPUT_STORAGE }; hr = RegisterSnapin( regkeySnapins, strMyComputerCLSID, g_aNodetypeGuids[MYCOMPUT_COMPUTER].bstr, IDS_REGISTER_MYCOMPUT, IDS_SNAPINABOUT_PROVIDER, IDS_SNAPINABOUT_VERSION, true, strMyComputerAboutCLSID, mycomput_types, 4 ); if ( FAILED(hr) ) { ASSERT(FALSE); return SELFREG_E_CLASS; }
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 = MYCOMPUT_COMPUTER; i < MYCOMPUT_NUMTYPES; i++) { regkeyNodeType.CreateKeyEx( regkeyNodeTypes, g_aNodetypeGuids[i].bstr ); regkeyNodeType.CloseKey(); } } catch (COleException* e) { ASSERT(FALSE); e->Delete(); return SELFREG_E_CLASS; }
return hr;
MFC_CATCH; }
/////////////////////////////////////////////////////////////////////////////
// DllUnregisterServer - Removes entries from the system registry
STDAPI DllUnregisterServer(void) { // ISSUE-2002/02/27-JonN Should probably remove MMC entries as well
_Module.UnregisterServer(); return S_OK; }
|