注册表编程扫盲(一)

来源:互联网 发布:mac os系统更新 编辑:程序博客网 时间:2024/06/04 18:41
前言    
    今天看了一本注册表方面的书,觉得还不错。特别还写了一章注册表编程。呵呵,我现在就我的理解把它贴上来给大家分享一下:)
    什么是注册表我不用说了吧,反正大家都知道了。不知道?其实注册表就是...就是...就是那么回事了,具体我也说不清楚。有一点是可以肯定的,通过修改注册表可以产生很牛的效果,比如说自动运行啊,隐藏驱动器之类的,反正很多用拉,数不清的。又比如说现在有n多软件功能丰富,其实都是在把注册表改来改去。呵呵,说了这么多废话,不好意思,恩,现在开始吧。
    操作注册表主要还是要靠API了,我数一下,1,2,3,...很多,就写一些比较常用的吧。不知道为什么,有这么多的注册表API,MS却没有把它们封装成一个类,很不爽。好了,先介绍一个操作注册表的一个重要变量类型:HKEY,一看这个类型以H开头,就知道它是一个句柄。什么是句柄我也不太懂,但是好象凡是win32编程都要用到句柄,按定义的话句柄是一个void *,可是又和平时说的指针不太一样。不管怎么说,HKEY就是一个Handle to a registry key,MSDN上是这样写的。翻译过来应该是一个注册表键的句柄,不知道对不对,唉,都怪我E文没学好,让大家笑了。在操作注册表的时候都要用到一个这样的句柄。好了,说了这么多先介绍几个API吧。

一。RegCreateKeyEx
   恩,来看看RegCreateKeyEx吧,一看这个函数的字面意思就知道是创建一个键。如果这个键已经存在的话,就相当是把它打开了。对了,还有个概念没说,什么是键。其实我一句话也说不清就有点象一个文件夹那样的,还不懂的话...不说了。这个函数的声明是这样的:
LONG RegCreateKeyEx(
  HKEY hKey,                
  LPCTSTR lpSubKey,         
  DWORD Reserved,           
  LPTSTR lpClass,           
  DWORD dwOptions,          
  REGSAM samDesired,        
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  PHKEY phkResult,        
  LPDWORD lpdwDisposition   
);
我来数一数,1,2,3...我靠,一共九个参数,累死我了。这么多参数怎么用呢?看一下。
hKey:这是一个已经打开的键的句柄,看来是要在一个已经打开的键建立一个子键了。就好象在一个已经存在的目录下建立一个字目录一样。对了,如果你开始没有一个已经打开的键的句柄,怎么办呢?有办法的,hKey还可以是如下的值:
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_PERFORMANCE_DATA(WinNT&&Win2K)
HKEY_DYN_DATA(Win98&&Win95&&WinMe)
其实一般情况下hKey的值都是这几种。具体是什么意思嘛,打开注册表编辑器就看见了:)打个比方就象你的电脑有A,C,D..几个盘一样,注册表也有几个这样的东西就是了。

lpSubKey:一个字符串,不用说是什么意思了吧?就是说你要把你的注册表键放在哪个位置了。有两点注意了,首先lpSubKey不能为NULL,还有就是(/),要写成(//)。

Reserved:没什么用,必须是0。

lpClass:又是一个字符串,据说是指定你要建立的键的类型,我也不知道怎么用就设它为NULL算了。

dwOptions:对你建立的键的一些选项。可以是这些值:REG_OPTION_NON_VOLATILE,
REG_OPTION_VOLATILE,
REG_OPTION_BACKUP_RESTORE
第一个是默认的了。一般用第一个就可以了。

samDesired :好象是你对这个新建的键的访问权限了,笑话,我自己建的我我当然要设置为KEY_ALL_ACCESS,也就是想怎么样就怎么样的那种。

lpSecurityAttributes:很麻烦,懒得说了,反正也不是很重要,还是把它设为NULL。

phkResult:这可是个很重要的参数了,你建立一个键后,这个键的句柄就放在这里,以后操作就全靠它了。注意了,它是一个指向HKEY的指针。

lpdwDisposition:又是一个指针,调用完此函数后,可以通过它来检测是打开了一个已经存在的键(REG_OPENED_EXISTING_KEY),还是建立了一个键(REG_CREATED_NEW_KEY)。

还有一个问题,就是返回值的问题,如果返回ERROR_SUCCESS,也就是0了,恭喜恭喜,成功了。最后举个例吧:
#include<windows.h>
void main()
{
 DWORD dwRes;
 HKEY hk;
 RegCreateKeyEx(HKEY_LOCAL_MACHINE,
               "SOFTWARE//Carrier Studio//Hello",  
0,                                  
NULL,                              
REG_OPTION_NON_VOLATILE,           
KEY_ALL_ACCESS,                    
NULL,                              
&hk,
                &dwRes
);
 if (dwRes == REG_CREATED_NEW_KEY)
 {
   printf("new key!!/n");
 }
}

原创粉丝点击