BOOL ReadStrRegTable(HKEY hKey, LPCSTR lpSubKey, LPCSTR lpItemName, TCHAR* pValue)
{
HKEY hKeyToOpen;
if ( RegOpenKeyEx(hKey,lpSubKey,0,KEY_READ,&hKeyToOpen) == ERROR_SUCCESS )
{
DWORD dwLength = 256;
if ( RegQueryValueEx(hKeyToOpen,lpItemName,NULL,NULL,(LPBYTE)pValue,&dwLength) != ERROR_SUCCESS )
return FALSE;
RegCloseKey(hKeyToOpen);
}
else
return FALSE;
return TRUE;
}
BOOL ReadDWRegTable(HKEY hKey, LPCSTR lpSubKey, LPCSTR lpItemName, DWORD* value)
{
HKEY hKeyToOpen;
if ( RegOpenKeyEx(hKey,lpSubKey,0,KEY_READ,&hKeyToOpen) == ERROR_SUCCESS )
{
DWORD dwLength = 256;
if ( RegQueryValueEx(hKeyToOpen,lpItemName,NULL,NULL,(LPBYTE)value,&dwLength) != ERROR_SUCCESS )
return FALSE;
RegCloseKey(hKeyToOpen);
}
else
return FALSE;
return TRUE;
}
BOOL CreateStrRegItem(HKEY hKey, LPCSTR lpSubKey, LPCSTR lpItemName, TCHAR* pValue)
{
HKEY hKeyCreated;
if( RegCreateKeyEx(hKey,lpSubKey,0,NULL,REG_OPTION_NON_VOLATILE,
KEY_READ|KEY_WRITE,NULL,&hKeyCreated,NULL) == ERROR_SUCCESS )
{
CString str;
str.Format("%s",pValue);
DWORD dwLength = str.GetLength();
if ( RegSetValueEx(hKeyCreated,lpItemName,0,REG_SZ,(const UCHAR*)pValue,dwLength) != ERROR_SUCCESS )
return FALSE;
RegCloseKey(hKeyCreated);
}
else
return FALSE;
return TRUE;
}
BOOL CreateDWRegItem(HKEY hKey, LPCSTR lpSubKey, LPCSTR lpItemName, DWORD dwValue)
{
HKEY hKeyCreated;
if( RegCreateKeyEx(hKey,lpSubKey,0,NULL,REG_OPTION_NON_VOLATILE,
KEY_READ|KEY_WRITE,NULL,&hKeyCreated,NULL) == ERROR_SUCCESS )
{
DWORD dwLength = sizeof(DWORD);
if ( RegSetValueEx(hKeyCreated,lpItemName,0,REG_DWORD,(const UCHAR*)&dwValue,dwLength) != ERROR_SUCCESS )
return FALSE;
RegCloseKey(hKeyCreated);
}
else
return FALSE;
return TRUE;
}
上面几个函数比较简单,但使用上有很大的局限性:它们的第一个参数必须是RootKey,或者是通过先调用RegOpenKeyEx获取相应的HKEY作为第一个参数。
主要介绍一下下面这个函数,它的第一个参数要求传入一个字符串,一般的格式为:
"HKEY_CURRENT_USER//Software//VideoHome//SkypeTV";
可以看出,要使此函数发挥作用,你必须将你想要操作的HKEY在注册表中的完整路径
作为一个字符串传入,第二个参数传入一个指针或地址,用于保存需要的HKEY
BOOL OpenRegKey(TCHAR* pszRegPath,HKEY* hKeyReturned)
{
BOOL bFirstSeprator = FALSE;
BOOL bFirstOpen = FALSE;
HKEY hRootKey;
HKEY hKeyOpened;
LONG lResult;
CString str;
TCHAR buf[256];
CString strKey1 = "";
CString strKey2 = "";
str.Format("%s",pszRegPath);
int length = str.GetLength();
memcpy(buf,pszRegPath,length);
for ( int i=0; i<length; i++ )
{
if ( buf[i] != '//' )
{
strKey1 += buf[i];
}
else
{
if( !bFirstSeprator )
{
bFirstSeprator = TRUE;
bFirstOpen = TRUE;
if( strKey1 == "HKEY_CLASSES_ROOT" )
hRootKey = HKEY_CLASSES_ROOT;
if( strKey1 == "HKEY_CURRENT_USER" )
hRootKey = HKEY_CURRENT_USER;
if( strKey1 == "HKEY_LOCAL_MACHINE" )
hRootKey = HKEY_LOCAL_MACHINE;
if( strKey1 == "HKEY_USERS" )
hRootKey = HKEY_USERS;
}
if( strKey1 != "" && strKey2 != "" )
{
if( bFirstOpen )
{
lResult = RegOpenKeyEx(hRootKey,strKey1,0,KEY_READ,&hKeyOpened);
if( lResult != ERROR_SUCCESS )
return FALSE;
bFirstOpen = FALSE;
}
else
{
lResult = RegOpenKeyEx(hKeyOpened,strKey1,0,KEY_READ,&hKeyOpened);
if( lResult != ERROR_SUCCESS )
return FALSE;
}
}
strKey2 = strKey1;
strKey1 = "";
}
}
lResult = RegOpenKeyEx(hKeyOpened,strKey1,0,KEY_READ|KEY_WRITE,hKeyReturned);
if( lResult != ERROR_SUCCESS )
return FALSE;
return TRUE;
}
下面是调用方法:
TCHAR path[256] = "HKEY_CURRENT_USER//Software//VideoHome//SkypeTV";
bOpen = OpenRegKey(path,&hkey);
if ( RegQueryValueEx(hkey,"StartMode",NULL,NULL,(LPBYTE)&value,&dwLength) != ERROR_SUCCESS )
return FALSE;
DWORD dwSetValue = 1;
if ( RegSetValueEx(hkey,"StartMode",0,REG_DWORD,(const BYTE*)&dwSetValue,dwLength) != ERROR_SUCCESS )
return FALSE;
改进版:改用C字符串,去除对CString的依赖,修正了一个BUG:RegCloseKey(hKeyOpened);在一般程序中不close hkey
可能没有太多关系,但在像DLL这种,或者是需要频繁调用此函数时将出错
BOOL OpenRegKey(TCHAR* pszRegPath,HKEY* hKeyReturned)
{
BOOL bFirstSeprator = FALSE;
BOOL bFirstOpen = FALSE;
HKEY hRootKey;
HKEY hKeyOpened;
LONG lResult;
TCHAR buf[256];
TCHAR strKey1[256];
TCHAR strKey2[256];
int length = 0;
while(1)
{
if( pszRegPath[length] != '/0' )
length++;
else
break;
}
memset(buf,0,length);
memcpy(buf,pszRegPath,length);
memset(strKey1,0,256);
memset(strKey2,0,256);
int j = 0;
for ( int i=0; i<length; i++ )
{
if ( buf[i] != '//' )
{
strKey1[j] = buf[i];
j++;
}
else
{
j=0;
//strKey1[i] = '/0';
if( !bFirstSeprator )
{
bFirstSeprator = TRUE;
bFirstOpen = TRUE;
if( strcmp(strKey1,"HKEY_CLASSES_ROOT")==0 )
hRootKey = HKEY_CLASSES_ROOT;
if( strcmp(strKey1,"HKEY_CURRENT_USER")==0 )
hRootKey = HKEY_CURRENT_USER;
if( strcmp(strKey1,"HKEY_LOCAL_MACHINE")==0 )
hRootKey = HKEY_LOCAL_MACHINE;
if( strcmp(strKey1,"HKEY_USERS")==0 )
hRootKey = HKEY_USERS;
}
if( strcmp(strKey1,"")!=0 && strcmp(strKey2,"")!=0 )
{
if( bFirstOpen )
{
lResult = RegOpenKeyEx(hRootKey,strKey1,0,KEY_READ,&hKeyOpened);
if( lResult != ERROR_SUCCESS )
return FALSE;
bFirstOpen = FALSE;
}
else
{
lResult = RegOpenKeyEx(hKeyOpened,strKey1,0,KEY_READ,&hKeyOpened);
if( lResult != ERROR_SUCCESS )
return FALSE;
}
}
//strKey2 = strKey1;
memcpy(strKey2,strKey1,length);
memset(strKey1,0,length);
}
}
lResult = RegOpenKeyEx(hKeyOpened,strKey1,0,KEY_READ|KEY_WRITE,hKeyReturned);
lResult = RegCloseKey(hKeyOpened);
if( lResult != ERROR_SUCCESS )
return FALSE;
return TRUE;
}