windows-nt/Source/XPSP1/NT/admin/snapin/mycomput/mycomput.cpp
2020-09-26 16:20:57 +08:00

153 lines
3.8 KiB
C++

// 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)
{
_Module.UnregisterServer();
return S_OK;
}