//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 2000 - 2001. // // File: dllmain.cpp // // Contents: Module, Object Map and DLL entry points. Most of the code // in this file is taken from Dns Manager Snapin implementation // // History: 07-26-2001 Hiteshr Created // //---------------------------------------------------------------------------- #include "headers.h" // //CRoleMgrModule Implementation // HRESULT WINAPI CRoleMgrModule::UpdateRegistryCLSID(const CLSID& clsid, BOOL bRegister) { TRACE_METHOD_EX(DEB_DLL, CRoleMgrModule, UpdateRegistryCLSID); static const WCHAR szIPS32[] = _T("InprocServer32"); static const WCHAR szCLSID[] = _T("CLSID"); HRESULT hRes = S_OK; LPOLESTR lpOleStrCLSIDValue = NULL; ::StringFromCLSID(clsid, &lpOleStrCLSIDValue); if (lpOleStrCLSIDValue == NULL) { DBG_OUT_HRESULT(E_OUTOFMEMORY); return E_OUTOFMEMORY; } CRegKey key; if (bRegister) { LONG lRes = key.Open(HKEY_CLASSES_ROOT, szCLSID); CHECK_LASTERROR(lRes); if (lRes == ERROR_SUCCESS) { lRes = key.Create(key, lpOleStrCLSIDValue); CHECK_LASTERROR(lRes); if (lRes == ERROR_SUCCESS) { WCHAR szModule[_MAX_PATH + 1]; ZeroMemory(szModule,sizeof(szModule)); ::GetModuleFileName(m_hInst, szModule, _MAX_PATH); lRes = key.SetKeyValue(szIPS32, szModule); CHECK_LASTERROR(lRes); } } if (lRes != ERROR_SUCCESS) hRes = HRESULT_FROM_WIN32(lRes); } else { key.Attach(HKEY_CLASSES_ROOT); if (key.Open(key, szCLSID) == ERROR_SUCCESS) key.RecurseDeleteKey(lpOleStrCLSIDValue); } ::CoTaskMemFree(lpOleStrCLSIDValue); return hRes; } // //Module // CRoleMgrModule _Module; // //Object Pikcer Clipboard format // UINT g_cfDsSelectionList = 0; // //Object Map // BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_RoleSnapin, CRoleComponentDataObject) // standalone snapin OBJECT_ENTRY(CLSID_RoleSnapinAbout, CRoleSnapinAbout) // standalone snapin about END_OBJECT_MAP() CCommandLineOptions commandLineOptions; // //CRoleSnapinApp implementation // BOOL CRoleSnapinApp::InitInstance() { #if (DBG == 1) CDbg::s_idxTls = TlsAlloc(); #endif // (DBG == 1) TRACE_METHOD_EX(DEB_DLL,CRoleSnapinApp,InitInstance); _Module.Init(ObjectMap, m_hInstance); g_cfDsSelectionList = RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST); // // Add theming support // SHFusionInitializeFromModuleID(m_hInstance, 2); // //Load Menus, Header Strings etc. // if (!CRoleComponentDataObject::LoadResources()) return FALSE; commandLineOptions.Initialize(); //Register Class for link window LinkWindow_RegisterClass(); return CWinApp::InitInstance(); } int CRoleSnapinApp::ExitInstance() { TRACE_METHOD_EX(DEB_DLL,CRoleSnapinApp,ExitInstance); // //Theming support // SHFusionUninitialize(); //Unregister class for link window LinkWindow_UnregisterClass(m_hInstance); // //CComModule Termintaion // _Module.Term(); return CWinApp::ExitInstance(); } CRoleSnapinApp theApp; // //Exported Functions // STDAPI DllCanUnloadNow(void) { TRACE_FUNCTION_EX(DEB_DLL,DllCanUnloadNow); AFX_MANAGE_STATE(AfxGetStaticModuleState()); if ((AfxDllCanUnloadNow() == S_OK) && (_Module.GetLockCount()==0)) { Dbg(DEB_DLL, "Can Unload\n"); return S_OK; } else { Dbg(DEB_DLL, "Cannot Unload, %u locks\n",_Module.GetLockCount()); return S_FALSE; } } STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { TRACE_FUNCTION_EX(DEB_DLL, DllGetClassObject); return _Module.GetClassObject(rclsid, riid, ppv); } // //Add the Guids of nodes which can be extended by other snapin // static _NODE_TYPE_INFO_ENTRY NodeTypeInfoEntryArray[] = { { NULL, NULL } }; STDAPI DllRegisterServer(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); TRACE_FUNCTION_EX(DEB_DLL, DllRegisterServer); // // registers all objects // HRESULT hr = _Module.RegisterServer(/* bRegTypeLib */ FALSE); if (FAILED(hr)) { DBG_OUT_HRESULT(hr); return hr; } CString szVersion = VER_PRODUCTVERSION_STR; CString szProvider = VER_COMPANYNAME_STR; CString szSnapinName; szSnapinName.LoadString(IDS_SNAPIN_NAME); // // Register the standalone Role snapin into the console snapin list // hr = RegisterSnapin(&CLSID_RoleSnapin, &CRoleRootData::NodeTypeGUID, &CLSID_RoleSnapinAbout, szSnapinName, szVersion, szProvider, FALSE, NodeTypeInfoEntryArray, IDS_SNAPIN_NAME); if (FAILED(hr)) { DBG_OUT_HRESULT(hr); return hr; } return hr; } STDAPI DllUnregisterServer(void) { TRACE_FUNCTION_EX(DEB_DLL, DllUnregisterServer); HRESULT hr = _Module.UnregisterServer(); ASSERT(SUCCEEDED(hr)); // // Un register the standalone snapin // hr = UnregisterSnapin(&CLSID_RoleSnapin); ASSERT(SUCCEEDED(hr)); // // unregister the snapin nodes, // this removes also the server node, with the Services Snapin extension keys // for (_NODE_TYPE_INFO_ENTRY* pCurrEntry = NodeTypeInfoEntryArray; pCurrEntry->m_pNodeGUID != NULL; pCurrEntry++) { hr = UnregisterNodeType(pCurrEntry->m_pNodeGUID); ASSERT(SUCCEEDED(hr)); } ASSERT(SUCCEEDED(hr)); return S_OK; }