读写注册表

发布时间:2016-12-8 4:12:51 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"读写注册表",主要涉及到读写注册表方面的内容,对于读写注册表感兴趣的同学可以参考一下。

Win 95及NT的注册数据库(Registry)是系统中非常重要的组成部分。在Win32 API中有一组Reg函数来处理这些问题。其一般的读写过程如下:     1、使用RegOpenKeyEx或RegCreateKeyEx函数打开或创建一个键;     2、如果上一步成功,使用RegQueryValueEx读取子键的值,使用RegSetValueEx设置子键值,使用RegEnumKey获得所有子键,使用RegDeleteKey删除一个键;     3、完成操作后使用RegCloseKey关闭键。     下面这段程序打开HKEY_CURRENT_USER/Software/Zeal SoftStudio/AskPro FTP/LastTime键,然后读取WOL子键的值。     HKEY hkey;     char sz[256];     DWORD dwtype, sl = 256;          RegOpenKeyEx(HKEY_CURRENT_USER,     "Software//Zeal SoftStudio//AskPro FTP//LastTime",     NULL, KEY_ALL_ACCESS, &hkey);     RegQueryValueEx(hkey, "WOL", NULL, &dwtype, (LPBYTE)sz, &sl);     RegCloseKey(hkey);     MFC程序可以使用CRegKey类读写注册表。VB中调用API的办法可以参考QA000226 "如何访问Windows系统注册表"。    打开注册键    LONG RegOpenKeyEx( HKEY hKey,  // handle to open key     LPCTSTR lpSubKey,              // address of name of subkey to open     DWORD ulOptions,               // reserved =0    REGSAM samDesired,             // security access mask     PHKEY phkResult                // address of handle to open key     );    例:    HKEY hd;    hd=HKEY_LOCAL_MACHINE;    char* Regkeyname="SoftWare//Xy123//Poker//";    LONG a=RegOpenKeyEx(hd,Regkeyname,0,KEY_READ,&hd);   //成功返回ERROR_SUCCESS,否则返回错误代码     关闭注册键    LONG RegCloseKey( HKEY hKey // handle to key to close );例:     RegCloseKey(HKEY_LOCAL_MACHINE);OR:  RegCloseKey(hd); 建立注册键LONG RegCreateKeyEx( HKEY hKey, // handle to an open key       LPCTSTR lpSubKey, // address of subkey name       DWORD Reserved, // reserved =0      LPTSTR lpClass, // address of class string       DWORD dwOptions, // special options flag       REGSAM samDesired, // desired security access       LPSECURITY_ATTRIBUTES lpSecurityAttributes, // address of key security         structure       PHKEY phkResult, // address of buffer for opened handle       LPDWORD lpdwDisposition // address of disposition value buffer );例:   char *sclass="";  //类名指定为空   DWORD nbf=0;    //接受返回值,指明是建立新键还是打开已有的键.(经试验总是返回REG_OPENED_EXISTING_KEY.   LONG II=RegCreateKeyEx(hd,Regkeyname,0,sclass,REG_OPTION_NON_VOLATILE,                KEY_READ|KEY_WRITE,NULL,&hd,&nbf);//REG_OPTION_NON_VOLATILE 指明键永久保留.安全结构指明NULL,自动获得一默认值//成功返回ERROR_SUCCESS,否则返回错误代码 枚举键值LONG RegEnumValue( HKEY hKey, // handle to key to query       DWORD dwIndex, // index of value to query       LPTSTR lpValueName, // address of buffer for value string       LPDWORD lpcbValueName, // address for size of value buffer       LPDWORD lpReserved, // reserved =NULL      LPDWORD lpType, // address of buffer for type code       LPBYTE lpData, // address of buffer for value data       LPDWORD lpcbData // address for size of data buffer);例:   DWORD dinx=0;   char valuename[70];  //分配数值名称缓冲区   strcpy(valuename,"DeskPattern");  //随便指定哪个键值名   DWORD nsize=69;  //数值名称缓冲区大小   DWORD k=REG_SZ;  //指明数据类型   unsigned char vari[70]; //分配数值缓冲区   DWORD ncbvari=69; //数值缓冲区大小   dinx=0; //从0开始   while((II=RegEnumValue(hd,dinx,valuename,&nsize,NULL,&k,vari,&ncbvari))           != ERROR_NO_MORE_ITEMS)   {       dinx++;//索引 +1,准备取下一个值       nsize=69; //恢复原来大小       ncbvari=69;   }成功后返回值0,各变量返回后设置如下:valuename=数值名称,以0结尾;如 : DeskColornsize=数值名称长度, 9k=REG_SZ  DeskColor 的类型为 REG_SZvari=键值,32768 DeskColor="32768",ncbvari=键值长度 REG_SZ包括结尾0,=6, 读取键值LONG RegQueryValueEx( HKEY hKey, // handle to key to query        LPTSTR lpValueName, // address of name of value to query        LPDWORD lpReserved, // reserved        LPDWORD lpType, // address of buffer for value type        LPBYTE lpData, // address of data buffer        LPDWORD lpcbData // address of data buffer size );例:   RegQueryValueEx(hd,valuename,NULL,&k,vari,&ncbvari);变量定义及成功后各变量设置值同RegEnumValueEx 写键值LONG RegSetValueEx( HKEY hKey, // handle to key to set value for        LPCTSTR lpValueName, // name of the value to set        DWORD Reserved, // reserved        DWORD dwType, // flag for value type        CONST BYTE *lpData, // address of value data        DWORD cbData // size of value data );例:   strcpy(valuename,"Hello");   unsigned char vari[10];   DWORD k=REG_SZ;   strcpy((char*)vari,"1234567")   RegSetValueEx(hd,valuename,0,k,vari,7);成功后在Poker下增加一个键值 Hello : REG_SZ : 1234567写整型变量:int hi=8;RegSetValueEx(pj,valuename,0,REG_BINARY,(unsigned char*)&hi,sizeof(int));成功后在Poker下增加一个键值 Hello2 : REG_BINARY :08 00 00 00void AddEventSource(){    HKEY hk;     DWORD dwData;     UCHAR szBuf[80];     // Add your source name as a subkey under the Application     // key in the EventLog registry key.     if (RegCreateKey(HKEY_LOCAL_MACHINE,             "SYSTEM//CurrentControlSet//Services/             //EventLog//Application//SamplApp", &hk))         ErrorExit("Could not create the registry key.");     // Set the name of the message file.     strcpy(szBuf, "%SystemRoot%//System//SamplApp.dll");     // Add the name to the EventMessageFile subkey.     if (RegSetValueEx(hk,             // subkey handle             "EventMessageFile",       // value name             0,                        // must be zero             REG_EXPAND_SZ,            // value type             (LPBYTE) szBuf,           // pointer to value data             strlen(szBuf) + 1))       // length of value data         ErrorExit("Could not set the event message file.");     // Set the supported event types in the TypesSupported subkey.     dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE |         EVENTLOG_INFORMATION_TYPE;     if (RegSetValueEx(hk,      // subkey handle             "TypesSupported",  // value name             0,                 // must be zero             REG_DWORD,         // value type             (LPBYTE) &dwData,  // pointer to value data             sizeof(DWORD)))    // length of value data         ErrorExit("Could not set the supported types.");     RegCloseKey(hk); } 以下代码把注册表自启动shell的键值改写为C:/DK1/ATM/HARP/ExAtmShell.exe:         HKEY hkey;LONG res; DWORD datatype=REG_SZ; unsigned char szvalue[_MAX_PATH];strcpy((char*)szvalue,"C://DK1//ATM//HARP//ExAtmShell.exe");res =::RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//Windows NT//CurrentVersion//Winlogon//", 0, KEY_WRITE|KEY_READ, &hkey); if(res!=ERROR_SUCCESS){AfxMessageBox("aaa");return;}res = ::RegSetValueEx(hkey, "Shell", 0, datatype, szvalue, strlen(LPCSTR(szvalue))); RegCloseKey(hkey);if(res==ERROR_SUCCESS)::AfxMessageBox("你已经成功地将注册表自启动shell的键值设置为C://DK1//ATM//HARP//ExAtmShell.exe");else::AfxMessageBox("设定失败:目标位置不存在这样的键!"); 

上一篇:我的时差
下一篇:VC制作初始画面

相关文章

关键词: 读写注册表

相关评论