VC 注册表函数

 
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;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值