|
|
// filemgmt.cpp : Implementation of DLL Exports.
// To fully complete this project follow these steps
// You will need the new MIDL compiler to build this project. Additionally,
// if you are building the proxy stub DLL, you will need new headers and libs.
// 1) Add a custom build step to filemgmt.idl
// You can select all of the .IDL files by holding Ctrl and clicking on
// each of them.
//
// Description
// Running MIDL
// Build Command(s)
// midl filemgmt.idl
// Outputs
// filemgmt.tlb
// filemgmt.h
// mmcfmgm_i.c
//
// NOTE: You must use the MIDL compiler from NT 4.0,
// preferably 3.00.15 or greater
// 2) Add a custom build step to the project to register the DLL
// For this, you can select all projects at once
// Description
// Registering OLE Server...
// Build Command(s)
// regsvr32 /s /c "$(TargetPath)"
// echo regsvr32 exec. time > "$(OutDir)\regsvr32.trg"
// Outputs
// $(OutDir)\regsvr32.trg
// 3) To add UNICODE support, follow these steps
// Select Build|Configurations...
// Press Add...
// Change the configuration name to Unicode Release
// Change the "Copy Settings From" combo to filemgmt - Win32 Release
// Press OK
// Press Add...
// Change the configuration name to Unicode Debug
// Change the "Copy Settings From" combo to filemgmt - Win32 Debug
// Press OK
// Press "Close"
// Select Build|Settings...
// Select the two UNICODE projects and press the C++ tab.
// Select the "General" category
// Add _UNICODE to the Preprocessor definitions
// Select the Unicode Debug project
// Press the "General" tab
// Specify DebugU for the intermediate and output directories
// Select the Unicode Release project
// Press the "General" tab
// Specify ReleaseU for the intermediate and output directories
// 4) Proxy stub DLL
// To build a separate proxy/stub DLL,
// run nmake -f ps.mak in the project directory.
#include "stdafx.h"
#include "initguid.h"
#include "filemgmt.h"
#include "cmponent.h"
#include "compdata.h"
#include "macros.h" // MFC_TRY/MFC_CATCH
#include "regkey.h" // AMC::CRegKey
#include "strings.h" // SNAPINS_KEY etc.
#include "guidhelp.h" // GuidToCString
#include <compuuid.h> // UUIDs for Computer Management
#include "about.h"
#include "snapreg.h" // RegisterSnapin
USE_HANDLE_MACROS("FILEMGMT(filemgmt.cpp)") \
const CLSID CLSID_FileServiceManagement = {0x58221C65,0xEA27,0x11CF,{0xAD,0xCF,0x00,0xAA,0x00,0xA8,0x00,0x33}}; const CLSID CLSID_SystemServiceManagement = {0x58221C66,0xEA27,0x11CF,{0xAD,0xCF,0x00,0xAA,0x00,0xA8,0x00,0x33}}; const CLSID CLSID_FileServiceManagementExt = {0x58221C69,0xEA27,0x11CF,{0xAD,0xCF,0x00,0xAA,0x00,0xA8,0x00,0x33}}; const CLSID CLSID_SystemServiceManagementExt = {0x58221C6a,0xEA27,0x11CF,{0xAD,0xCF,0x00,0xAA,0x00,0xA8,0x00,0x33}}; const CLSID CLSID_FileServiceManagementAbout = {0xDB5D1FF4,0x09D7,0x11D1,{0xBB,0x10,0x00,0xC0,0x4F,0xC9,0xA3,0xA3}}; const CLSID CLSID_SystemServiceManagementAbout ={0xDB5D1FF5,0x09D7,0x11D1,{0xBB,0x10,0x00,0xC0,0x4F,0xC9,0xA3,0xA3}}; #ifdef SNAPIN_PROTOTYPER
const CLSID CLSID_SnapinPrototyper = {0xab17ce10,0x9b30,0x11d0,{0xb6, 0xa6, 0x00, 0xaa, 0x00, 0x6e, 0xb9, 0x5b}}; #endif
CComModule _Module; HINSTANCE g_hInstanceSave; // Instance handle of the DLL
BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_FileServiceManagement, CFileSvcMgmtSnapin) OBJECT_ENTRY(CLSID_SystemServiceManagement, CServiceMgmtSnapin) OBJECT_ENTRY(CLSID_FileServiceManagementExt, CFileSvcMgmtExtension) OBJECT_ENTRY(CLSID_SystemServiceManagementExt, CServiceMgmtExtension) OBJECT_ENTRY(CLSID_FileServiceManagementAbout, CFileSvcMgmtAbout) OBJECT_ENTRY(CLSID_SystemServiceManagementAbout, CServiceMgmtAbout) OBJECT_ENTRY(CLSID_SvcMgmt, CStartStopHelper) #ifdef SNAPIN_PROTOTYPER
OBJECT_ENTRY(CLSID_SnapinPrototyper, CServiceMgmtSnapin) #endif
END_OBJECT_MAP()
class CFileServiceMgmtApp : public CWinApp { public: virtual BOOL InitInstance(); virtual int ExitInstance(); };
CFileServiceMgmtApp theApp;
BOOL CFileServiceMgmtApp::InitInstance() { _Module.Init(ObjectMap, m_hInstance); SHFusionInitializeFromModuleID (m_hInstance, 2); VERIFY( SUCCEEDED(CFileMgmtComponent::LoadStrings()) ); g_hInstanceSave = AfxGetInstanceHandle(); return CWinApp::InitInstance(); }
int CFileServiceMgmtApp::ExitInstance() { SHFusionUninitialize();
_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() && _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, there is no typelib
hr = _Module.RegisterServer(FALSE); if ( FAILED(hr) ) { ASSERT(FALSE && "_Module.RegisterServer(TRUE) failure."); return SELFREG_E_CLASS; }
CString strFileMgmtCLSID, strSvcMgmtCLSID; CString strFileMgmtExtCLSID, strSvcMgmtExtCLSID; CString strFileMgmtAboutCLSID, strSvcMgmtAboutCLSID; if ( FAILED(hr = GuidToCString( &strFileMgmtCLSID, CLSID_FileServiceManagement )) || FAILED(hr = GuidToCString( &strSvcMgmtCLSID, CLSID_SystemServiceManagement )) || FAILED(hr = GuidToCString( &strFileMgmtExtCLSID, CLSID_FileServiceManagementExt )) || FAILED(hr = GuidToCString( &strSvcMgmtExtCLSID, CLSID_SystemServiceManagementExt )) || FAILED(hr = GuidToCString( &strFileMgmtAboutCLSID, CLSID_FileServiceManagementAbout )) || FAILED(hr = GuidToCString( &strSvcMgmtAboutCLSID, CLSID_SystemServiceManagementAbout )) ) { 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 filemgmt_types[7] = { FILEMGMT_ROOT, FILEMGMT_SHARES, FILEMGMT_SESSIONS, FILEMGMT_RESOURCES, FILEMGMT_SHARE, FILEMGMT_SESSION, FILEMGMT_RESOURCE }; hr = RegisterSnapin( regkeySnapins, strFileMgmtCLSID, g_aNodetypeGuids[FILEMGMT_ROOT].bstr, IDS_REGISTER_FILEMGMT, IDS_SNAPINABOUT_PROVIDER, IDS_SNAPINABOUT_VERSION, true, strFileMgmtAboutCLSID, filemgmt_types, 7 ); if ( FAILED(hr) ) { ASSERT(FALSE); return SELFREG_E_CLASS; } static int svcmgmt_types[2] = { FILEMGMT_SERVICES, FILEMGMT_SERVICE }; hr = RegisterSnapin( regkeySnapins, strSvcMgmtCLSID, g_aNodetypeGuids[FILEMGMT_SERVICES].bstr, IDS_REGISTER_SVCMGMT, IDS_SNAPINABOUT_PROVIDER, IDS_SNAPINABOUT_VERSION, true, strSvcMgmtAboutCLSID, svcmgmt_types, 2 ); if ( FAILED(hr) ) { ASSERT(FALSE); return SELFREG_E_CLASS; } static int filemgmtext_types[7] = { FILEMGMT_ROOT, FILEMGMT_SHARES, FILEMGMT_SESSIONS, FILEMGMT_RESOURCES, FILEMGMT_SHARE, FILEMGMT_SESSION, FILEMGMT_RESOURCE }; hr = RegisterSnapin( regkeySnapins, strFileMgmtExtCLSID, NULL, // no primary nodetype
IDS_REGISTER_FILEMGMT_EXT, IDS_SNAPINABOUT_PROVIDER, IDS_SNAPINABOUT_VERSION, false, // JonN 11/11/98 changed to use same About handler
strFileMgmtAboutCLSID, filemgmtext_types, 7 ); if ( FAILED(hr) ) { ASSERT(FALSE); return SELFREG_E_CLASS; } static int svcmgmtext_types[2] = { FILEMGMT_SERVICES, FILEMGMT_SERVICE }; hr = RegisterSnapin( regkeySnapins, strSvcMgmtExtCLSID, NULL, // no primary nodetype
IDS_REGISTER_SVCMGMT_EXT, IDS_SNAPINABOUT_PROVIDER, IDS_SNAPINABOUT_VERSION, false, // JonN 11/11/98 changed to use same About handler
strSvcMgmtAboutCLSID, svcmgmtext_types, 2 ); if ( FAILED(hr) ) { ASSERT(FALSE); return SELFREG_E_CLASS; }
CString strFileExt, strSystemExt, strDefaultViewExt; if ( !strFileExt.LoadString(IDS_REGISTER_FILEMGMT_EXT) || !strSystemExt.LoadString(IDS_REGISTER_SVCMGMT_EXT) || !strDefaultViewExt.LoadString(IDS_REGISTER_DEFAULT_VIEW_EXT) ) { 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 = FILEMGMT_ROOT; i < FILEMGMT_NUMTYPES; i++) { regkeyNodeType.CreateKeyEx( regkeyNodeTypes, g_aNodetypeGuids[i].bstr ); regkeyNodeType.CloseKey(); }
regkeyNodeType.CreateKeyEx( regkeyNodeTypes, TEXT(struuidNodetypeSystemTools) ); { AMC::CRegKey regkeyExtensions; regkeyExtensions.CreateKeyEx( regkeyNodeType, g_szExtensions ); AMC::CRegKey regkeyNameSpace; regkeyNameSpace.CreateKeyEx( regkeyExtensions, g_szNameSpace ); regkeyNameSpace.SetString( strFileMgmtExtCLSID, strFileExt ); // JonN 5/27/99 deregister as extension of System Tools
// ignore errors
(void)::RegDeleteValue(regkeyNameSpace, strSvcMgmtExtCLSID); } regkeyNodeType.CloseKey();
// JonN 5/27/99 register as extension of Server Apps
regkeyNodeType.CreateKeyEx( regkeyNodeTypes, TEXT(struuidNodetypeServerApps) ); { AMC::CRegKey regkeyExtensions; regkeyExtensions.CreateKeyEx( regkeyNodeType, g_szExtensions ); AMC::CRegKey regkeyNameSpace; regkeyNameSpace.CreateKeyEx( regkeyExtensions, g_szNameSpace ); (void)::RegDeleteValue(regkeyNameSpace, strFileMgmtExtCLSID); regkeyNameSpace.SetString( strSvcMgmtExtCLSID, strSystemExt ); } regkeyNodeType.CloseKey();
// JonN 5/16/00 register Default View Extension under Services node
regkeyNodeType.CreateKeyEx( regkeyNodeTypes, TEXT(struuidNodetypeServices) ); { AMC::CRegKey regkeyExtensions; regkeyExtensions.CreateKeyEx( regkeyNodeType, g_szExtensions ); AMC::CRegKey regkeyView; regkeyView.CreateKeyEx( regkeyExtensions, L"View" ); regkeyView.SetString( L"{B708457E-DB61-4C55-A92F-0D4B5E9B1224}", strDefaultViewExt ); } regkeyNodeType.CloseKey();
} catch (COleException* e) { ASSERT(FALSE); e->Delete(); return SELFREG_E_CLASS; }
return hr;
MFC_CATCH; }
/////////////////////////////////////////////////////////////////////////////
// DllUnregisterServer - Adds entries to the system registry
STDAPI DllUnregisterServer(void) { HRESULT hRes = S_OK; _Module.UnregisterServer();
// CODEWORK need to unregister properly
return hRes; }
|