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

155 lines
4 KiB
C++

/////////////////////////////////////////////////////////////////////
// DynExten.cpp : enumerates installed services on (possibly remote) computer
//
// HISTORY
// 30-Oct-97 JonN Creation.
/////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "macros.h"
USE_HANDLE_MACROS("MMCFMGMT(dynexten.cpp)")
#include "compdata.h"
#include "cookie.h"
#include "regkey.h" // AMC::CRegKey
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
const TCHAR SERVICES_KEY[] = TEXT("System\\CurrentControlSet\\Control\\Server Applications");
const TCHAR CLSID_KEY[] = TEXT("Clsid\\");
HRESULT DynextenCheckInstall( const GUID& guidExtension, const TCHAR* pszExtension )
{
HRESULT hr = S_OK;
#ifdef USE_CLASS_STORE
IClassAccess* pIClassAccess = NULL;
#endif
try
{
TCHAR achRegPath[ MAX_PATH ];
_tcscpy( achRegPath, CLSID_KEY );
_tcsncat( achRegPath, pszExtension, MAX_PATH - _tcslen(achRegPath) );
achRegPath[MAX_PATH-1] = TEXT('\0'); // JonN 11/21/00 PREFIX 226785/226786
AMC::CRegKey regkeyInstalled;
BOOL fFound = regkeyInstalled.OpenKeyEx( HKEY_CLASSES_ROOT, achRegPath, KEY_READ );
if ( fFound )
{
return S_OK; // it is already installed
}
// CODEWORK It would be more efficient to access the Class Store directly
// by calling CoGetClassAccess, then IClassAccess->GetAppInfo(), then CoInstall().
#ifdef USE_CLASS_STORE
// now we have to get the Class Store to install it
do { // false loop
hr = CoGetClassAccess( &pIClassAccess );
if ( FAILED(hr) )
break;
// now what???
} while (FALSE); // false loop
#else
IUnknown* pIUnknown = NULL;
hr = ::CoCreateInstance( guidExtension,
NULL,
CLSCTX_INPROC,
IID_IComponentData,
(PVOID*)&pIUnknown );
if (NULL != pIUnknown)
pIUnknown->Release();
// allow hr to fall through
#endif
}
catch (COleException* e)
{
e->Delete();
return E_FAIL;
}
#ifdef USE_CLASS_STORE
if (NULL != pIClassAccess)
pIClassAccess->Release();
#endif
return hr;
}
//
// CMyComputerComponentData
//
static CLSID CLSID_DnsSnapin =
{ 0x80105023, 0x50B1, 0x11d1, { 0xB9, 0x30, 0x00, 0xA0, 0xC9, 0xA0, 0x6D, 0x2D } };
static CLSID CLSID_FileServiceManagementExt = {0x58221C69,0xEA27,0x11CF,{0xAD,0xCF,0x00,0xAA,0x00,0xA8,0x00,0x33}};
HRESULT CMyComputerComponentData::ExpandServerApps(
HSCOPEITEM hParent,
CMyComputerCookie* pcookie )
{
try
{
AMC::CRegKey regkeyServices;
BOOL fFound = TRUE;
if (NULL == pcookie->QueryTargetServer())
{
fFound = regkeyServices.OpenKeyEx( HKEY_LOCAL_MACHINE, SERVICES_KEY, KEY_READ );
}
else
{
AMC::CRegKey regkeyRemoteComputer;
regkeyRemoteComputer.ConnectRegistry(
const_cast<LPTSTR>(pcookie->QueryTargetServer()) );
fFound = regkeyServices.OpenKeyEx( regkeyRemoteComputer, SERVICES_KEY, KEY_READ );
}
if ( !fFound )
{
return S_OK; // CODEWORK what return code?
}
CComQIPtr<IConsoleNameSpace2, &IID_IConsoleNameSpace2> pIConsoleNameSpace2
= m_pConsole;
if ( !pIConsoleNameSpace2 )
{
ASSERT(FALSE);
return E_UNEXPECTED;
}
TCHAR achValue[ MAX_PATH ];
DWORD iSubkey;
DWORD cchValue;
for ( iSubkey = 0;
cchValue = sizeof(achValue)/sizeof(TCHAR),
regkeyServices.EnumValue(
iSubkey,
achValue,
&cchValue );
iSubkey++ )
{
GUID guidExtension;
HRESULT hr = ::CLSIDFromString( achValue, &guidExtension );
if ( !SUCCEEDED(hr) )
continue;
hr = DynextenCheckInstall( guidExtension, achValue );
if ( !SUCCEEDED(hr) )
continue;
hr = pIConsoleNameSpace2->AddExtension( hParent, &guidExtension );
// ignore the return value
}
}
catch (COleException* e)
{
e->Delete();
return S_OK; // CODEWORK what return code?
}
return S_OK;
}