|
|
//
// Copyright (C) 2000 Microsoft Corporation. All Rights Reserved.
//
//
//
//==============================================================;
#include <windows.h>
#include <objbase.h>
#include <olectl.h>
extern GUID CLSID_CTSRemotePage;
LPCWSTR g_szExtKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Controls Folder\\" L"System\\shellex\\PropertySheetHandlers\\Remote Sessions CPL Extension"; LPCWSTR g_szApprovedKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved"; const WCHAR g_szExtName[] = L"Remote Sessions CPL Extension";
//*************************************************************
//
// RegisterServer()
//
// Purpose: Register the component in the registry
//
// Parameters: hModule - handle to this dll module
//
//
// Return: S_OK if success, error code otherwise
//
// Comments:
//
// History: Date Author Comment
// 5/26/00 a-skuzin Created
// 10/27/00 skuzin Added registration of the
// component as "Approved" CPL
// extension
//
//
//*************************************************************
HRESULT RegisterServer(HMODULE hModule) { // Get server location.
WCHAR szModule[MAX_PATH+1] ;
if(!GetModuleFileName(hModule, szModule, MAX_PATH)) { return E_UNEXPECTED; } // Get CLSID
LPOLESTR szCLSID = NULL ; HRESULT hr = StringFromCLSID(CLSID_CTSRemotePage, &szCLSID) ; if(FAILED(hr)) { return hr; } // Build the key CLSID\\{...}
LPWSTR szKey = new WCHAR[wcslen(L"CLSID\\")+wcslen(szCLSID)+1];
if(!szKey) { CoTaskMemFree(szCLSID); return E_OUTOFMEMORY; }
wcscpy(szKey, L"CLSID\\") ; wcscat(szKey, szCLSID) ; HKEY hKey1,hKey2; LONG Err, TotalErr = 0; // Create "CLSID\{...}" key
Err = RegCreateKeyExW(HKEY_CLASSES_ROOT, szKey, 0, NULL, 0, KEY_WRITE, NULL, &hKey1, NULL); delete szKey; TotalErr |= Err;
if(Err == ERROR_SUCCESS ) { Err = RegSetValueExW(hKey1, NULL, 0, REG_SZ, (CONST BYTE *)g_szExtName, sizeof(g_szExtName)); TotalErr |= Err; // Create "CLSID\{...}\InprocServer32" key
Err = RegCreateKeyExW(hKey1, L"InprocServer32", 0, NULL, 0, KEY_WRITE, NULL, &hKey2, NULL); TotalErr |= Err;
RegCloseKey(hKey1);
if(Err == ERROR_SUCCESS) { Err = RegSetValueExW(hKey2, NULL, 0, REG_SZ, (CONST BYTE *)szModule, (wcslen(szModule)+1)*sizeof(WCHAR));
TotalErr |= Err;
Err = RegSetValueExW(hKey2, L"ThreadingModel", 0, REG_SZ, (CONST BYTE *)L"Apartment", (wcslen(L"Apartment")+1)*sizeof(WCHAR)); TotalErr |= Err;
RegCloseKey(hKey2); } } //Register the component as System property sheet extension
Err = RegCreateKeyExW(HKEY_LOCAL_MACHINE, g_szExtKey, 0, NULL, 0, KEY_WRITE, NULL, &hKey1, NULL); TotalErr |= Err;
if(Err == ERROR_SUCCESS ) { Err = RegSetValueExW(hKey1, NULL, 0, REG_SZ, (CONST BYTE *)szCLSID, (wcslen(szCLSID)+1)*sizeof(WCHAR)); TotalErr |= Err;
RegCloseKey(hKey1); } //Make this property sheet extension "Approved"
Err = RegCreateKeyExW(HKEY_LOCAL_MACHINE, g_szApprovedKey, 0, NULL, 0, KEY_WRITE, NULL, &hKey1, NULL); TotalErr |= Err;
if(Err == ERROR_SUCCESS ) { Err = RegSetValueExW(hKey1, szCLSID, 0, REG_SZ, (CONST BYTE *)g_szExtName, sizeof(g_szExtName)); TotalErr |= Err;
RegCloseKey(hKey1); }
// Free memory.
CoTaskMemFree(szCLSID) ;
if( TotalErr == ERROR_SUCCESS ) { return S_OK; } else { return SELFREG_E_CLASS; } }
//*************************************************************
//
// UnregisterServer()
//
// Purpose: Deletes the component registration values
// from the registry
//
// Parameters: NONE
//
//
// Return: S_OK if success, error code otherwise
//
// Comments:
//
// History: Date Author Comment
// 5/26/00 a-skuzin Created
// 10/27/00 skuzin Modifyed to reflect
// changes in RegisterServer()
//
//*************************************************************
HRESULT UnregisterServer() { // Get CLSID
LPOLESTR szCLSID = NULL ; HRESULT hr = StringFromCLSID(CLSID_CTSRemotePage, &szCLSID) ; if(FAILED(hr)) { return hr; } // Build the key CLSID\\{...}\\InprocServer32
LPWSTR szKey = new WCHAR[wcslen(L"CLSID\\")+wcslen(szCLSID)+wcslen(L"\\InprocServer32")+1];
if(!szKey) { CoTaskMemFree(szCLSID); return E_OUTOFMEMORY; }
wcscpy(szKey, L"CLSID\\"); wcscat(szKey, szCLSID); wcscat(szKey, L"\\InprocServer32"); LONG Wrn, Err, TotalErr = ERROR_SUCCESS; // Delete "CLSID\{...}\InprocServer32" key
Err = RegDeleteKey(HKEY_CLASSES_ROOT, szKey) ; TotalErr |= Err;
//Try to delete "CLSID\{...}" key
//It is not an error if we cannot do this.
if(Err == ERROR_SUCCESS ) { szKey[wcslen(szKey)-wcslen(L"\\InprocServer32")] = 0; Wrn = RegDeleteKey(HKEY_CLASSES_ROOT, szKey); }
delete szKey; //Delete Property Sheet Handler registration
TotalErr |= RegDeleteKey(HKEY_LOCAL_MACHINE, g_szExtKey); //Remove component from list of "Approved" extensions
HKEY hKey; Err = RegOpenKeyEx(HKEY_LOCAL_MACHINE,g_szApprovedKey,0,KEY_WRITE,&hKey);
TotalErr |= Err;
if( Err == ERROR_SUCCESS ) { TotalErr|= RegDeleteValue(hKey,szCLSID);
RegCloseKey(hKey); }
// Free memory.
CoTaskMemFree(szCLSID);
if( TotalErr == ERROR_SUCCESS ) { if(Wrn == ERROR_SUCCESS) { return S_OK; } else { //we could not delete "CLSID\{...}" key
//probably it has subkeys created by a user.
return S_FALSE; } } else { return SELFREG_E_CLASS; } }
|