1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_shell.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #if defined _MSC_VER 32*cdf0e10cSrcweir #pragma warning(push, 1) 33*cdf0e10cSrcweir #endif 34*cdf0e10cSrcweir #include <windows.h> 35*cdf0e10cSrcweir #if defined _MSC_VER 36*cdf0e10cSrcweir #pragma warning(pop) 37*cdf0e10cSrcweir #endif 38*cdf0e10cSrcweir #include <malloc.h> 39*cdf0e10cSrcweir #include "internal/dbgmacros.hxx" 40*cdf0e10cSrcweir #include "internal/registry.hxx" 41*cdf0e10cSrcweir 42*cdf0e10cSrcweir #if defined _MSC_VER 43*cdf0e10cSrcweir #pragma warning(push, 1) 44*cdf0e10cSrcweir #endif 45*cdf0e10cSrcweir #include <objbase.h> 46*cdf0e10cSrcweir #if defined _MSC_VER 47*cdf0e10cSrcweir #pragma warning(pop) 48*cdf0e10cSrcweir #endif 49*cdf0e10cSrcweir 50*cdf0e10cSrcweir //--------------------------------------- 51*cdf0e10cSrcweir // 52*cdf0e10cSrcweir //--------------------------------------- 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir // Size of a CLSID as a string 55*cdf0e10cSrcweir const int CLSID_STRING_SIZE = 39; 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir //--------------------------------------- 58*cdf0e10cSrcweir // 59*cdf0e10cSrcweir //--------------------------------------- 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir bool SetRegistryKey(HKEY RootKey, const char* KeyName, const char* ValueName, const char* Value) 62*cdf0e10cSrcweir { 63*cdf0e10cSrcweir HKEY hSubKey; 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir // open or create the desired key 66*cdf0e10cSrcweir int rc = RegCreateKeyExA( 67*cdf0e10cSrcweir RootKey, KeyName, 0, "", REG_OPTION_NON_VOLATILE, KEY_WRITE, 0, &hSubKey, 0); 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir if (ERROR_SUCCESS == rc) 70*cdf0e10cSrcweir { 71*cdf0e10cSrcweir rc = RegSetValueExA( 72*cdf0e10cSrcweir hSubKey, ValueName, 0, REG_SZ, reinterpret_cast<const BYTE*>(Value), strlen(Value) + 1); 73*cdf0e10cSrcweir 74*cdf0e10cSrcweir RegCloseKey(hSubKey); 75*cdf0e10cSrcweir } 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir return (ERROR_SUCCESS == rc); 78*cdf0e10cSrcweir } 79*cdf0e10cSrcweir 80*cdf0e10cSrcweir //--------------------------------------- 81*cdf0e10cSrcweir // 82*cdf0e10cSrcweir //--------------------------------------- 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir bool DeleteRegistryKey(HKEY RootKey, const char* KeyName) 85*cdf0e10cSrcweir { 86*cdf0e10cSrcweir HKEY hKey; 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir int rc = RegOpenKeyExA( 89*cdf0e10cSrcweir RootKey, 90*cdf0e10cSrcweir KeyName, 91*cdf0e10cSrcweir 0, 92*cdf0e10cSrcweir KEY_READ | DELETE, 93*cdf0e10cSrcweir &hKey); 94*cdf0e10cSrcweir 95*cdf0e10cSrcweir if ( rc == ERROR_FILE_NOT_FOUND ) 96*cdf0e10cSrcweir return true; 97*cdf0e10cSrcweir 98*cdf0e10cSrcweir if (ERROR_SUCCESS == rc) 99*cdf0e10cSrcweir { 100*cdf0e10cSrcweir char* SubKey; 101*cdf0e10cSrcweir DWORD nMaxSubKeyLen; 102*cdf0e10cSrcweir 103*cdf0e10cSrcweir rc = RegQueryInfoKeyA( 104*cdf0e10cSrcweir hKey, 0, 0, 0, 0, 105*cdf0e10cSrcweir &nMaxSubKeyLen, 106*cdf0e10cSrcweir 0, 0, 0, 0, 0, 0); 107*cdf0e10cSrcweir 108*cdf0e10cSrcweir nMaxSubKeyLen++; // space for trailing '\0' 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir SubKey = reinterpret_cast<char*>( 111*cdf0e10cSrcweir _alloca(nMaxSubKeyLen*sizeof(char))); 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir while (ERROR_SUCCESS == rc) 114*cdf0e10cSrcweir { 115*cdf0e10cSrcweir DWORD nLen = nMaxSubKeyLen; 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir rc = RegEnumKeyExA( 118*cdf0e10cSrcweir hKey, 119*cdf0e10cSrcweir 0, // always index zero 120*cdf0e10cSrcweir SubKey, 121*cdf0e10cSrcweir &nLen, 122*cdf0e10cSrcweir 0, 0, 0, 0); 123*cdf0e10cSrcweir 124*cdf0e10cSrcweir if (ERROR_NO_MORE_ITEMS == rc) 125*cdf0e10cSrcweir { 126*cdf0e10cSrcweir rc = RegDeleteKeyA(RootKey, KeyName); 127*cdf0e10cSrcweir break; 128*cdf0e10cSrcweir } 129*cdf0e10cSrcweir else if (rc == ERROR_SUCCESS) 130*cdf0e10cSrcweir { 131*cdf0e10cSrcweir DeleteRegistryKey(hKey, SubKey); 132*cdf0e10cSrcweir } 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir } // while 135*cdf0e10cSrcweir 136*cdf0e10cSrcweir RegCloseKey(hKey); 137*cdf0e10cSrcweir 138*cdf0e10cSrcweir } // if 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir return (ERROR_SUCCESS == rc); 141*cdf0e10cSrcweir } 142*cdf0e10cSrcweir 143*cdf0e10cSrcweir /** May be used to determine if the specified registry key has subkeys 144*cdf0e10cSrcweir The function returns true on success else if an error occures false 145*cdf0e10cSrcweir */ 146*cdf0e10cSrcweir bool HasSubkeysRegistryKey(HKEY RootKey, const char* KeyName, /* out */ bool& bResult) 147*cdf0e10cSrcweir { 148*cdf0e10cSrcweir HKEY hKey; 149*cdf0e10cSrcweir 150*cdf0e10cSrcweir LONG rc = RegOpenKeyExA(RootKey, KeyName, 0, KEY_READ, &hKey); 151*cdf0e10cSrcweir 152*cdf0e10cSrcweir if (ERROR_SUCCESS == rc) 153*cdf0e10cSrcweir { 154*cdf0e10cSrcweir DWORD nSubKeys = 0; 155*cdf0e10cSrcweir 156*cdf0e10cSrcweir rc = RegQueryInfoKeyA(hKey, 0, 0, 0, &nSubKeys, 0, 0, 0, 0, 0, 0, 0); 157*cdf0e10cSrcweir 158*cdf0e10cSrcweir bResult = (nSubKeys > 0); 159*cdf0e10cSrcweir } 160*cdf0e10cSrcweir 161*cdf0e10cSrcweir return (ERROR_SUCCESS == rc); 162*cdf0e10cSrcweir } 163*cdf0e10cSrcweir 164*cdf0e10cSrcweir // Convert a CLSID to a char string. 165*cdf0e10cSrcweir std::string ClsidToString(const CLSID& clsid) 166*cdf0e10cSrcweir { 167*cdf0e10cSrcweir // Get CLSID 168*cdf0e10cSrcweir LPOLESTR wszCLSID = NULL; 169*cdf0e10cSrcweir StringFromCLSID(clsid, &wszCLSID); 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir char buff[39]; 172*cdf0e10cSrcweir // Covert from wide characters to non-wide. 173*cdf0e10cSrcweir wcstombs(buff, wszCLSID, sizeof(buff)); 174*cdf0e10cSrcweir 175*cdf0e10cSrcweir // Free memory. 176*cdf0e10cSrcweir CoTaskMemFree(wszCLSID) ; 177*cdf0e10cSrcweir 178*cdf0e10cSrcweir return std::string(buff); 179*cdf0e10cSrcweir } 180*cdf0e10cSrcweir 181*cdf0e10cSrcweir //--------------------------------------- 182*cdf0e10cSrcweir // 183*cdf0e10cSrcweir //--------------------------------------- 184*cdf0e10cSrcweir 185*cdf0e10cSrcweir bool QueryRegistryKey(HKEY RootKey, const char* KeyName, const char* ValueName, char *pszData, DWORD dwBufLen) 186*cdf0e10cSrcweir { 187*cdf0e10cSrcweir HKEY hKey; 188*cdf0e10cSrcweir 189*cdf0e10cSrcweir int rc = RegOpenKeyExA( 190*cdf0e10cSrcweir RootKey, 191*cdf0e10cSrcweir KeyName, 192*cdf0e10cSrcweir 0, 193*cdf0e10cSrcweir KEY_READ, 194*cdf0e10cSrcweir &hKey); 195*cdf0e10cSrcweir 196*cdf0e10cSrcweir if (ERROR_SUCCESS == rc) 197*cdf0e10cSrcweir { 198*cdf0e10cSrcweir rc = RegQueryValueExA( 199*cdf0e10cSrcweir hKey, ValueName, NULL, NULL, (LPBYTE)pszData,&dwBufLen); 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir RegCloseKey(hKey); 202*cdf0e10cSrcweir } 203*cdf0e10cSrcweir 204*cdf0e10cSrcweir return (ERROR_SUCCESS == rc); 205*cdf0e10cSrcweir } 206