﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Thinking in C++-文章分类-注册表</title><link>http://www.cppblog.com/yishanhante/category/3835.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 29 May 2008 06:36:13 GMT</lastBuildDate><pubDate>Thu, 29 May 2008 06:36:13 GMT</pubDate><ttl>60</ttl><item><title>读写注册表</title><link>http://www.cppblog.com/yishanhante/articles/20137.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Mon, 19 Mar 2007 06:47:00 GMT</pubDate><guid>http://www.cppblog.com/yishanhante/articles/20137.html</guid><wfw:comment>http://www.cppblog.com/yishanhante/comments/20137.html</wfw:comment><comments>http://www.cppblog.com/yishanhante/articles/20137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/yishanhante/comments/commentRss/20137.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/yishanhante/services/trackbacks/20137.html</trackback:ping><description><![CDATA[
		<p>Win 95及NT的注册数据库(Registry)是系统中非常重要的组成部分。在Win32 API中有一组Reg函数来处理这些问题。其一般的读写过程如下：<br /> <br />    1、使用RegOpenKeyEx或RegCreateKeyEx函数打开或创建一个键； <br />    2、如果上一步成功，使用RegQueryValueEx读取子键的值，使用RegSetValueEx设置子键值，使用RegEnumKey获得所有子键，使用RegDeleteKey删除一个键； <br />    3、完成操作后使用RegCloseKey关闭键。 <br />    下面这段程序打开HKEY_CURRENT_USER\Software\Zeal SoftStudio\AskPro FTP\LastTime键，然后读取WOL子键的值。 </p>
		<p>    HKEY hkey; <br />    char sz[256]; <br />    DWORD dwtype, sl = 256; <br />     <br />    RegOpenKeyEx(HKEY_CURRENT_USER, <br />    "Software\\Zeal SoftStudio\\AskPro FTP\\LastTime", <br />    NULL, KEY_ALL_ACCESS, &amp;hkey); <br />    RegQueryValueEx(hkey, "WOL", NULL, &amp;dwtype, (LPBYTE)sz, &amp;sl); <br />    RegCloseKey(hkey); <br />    MFC程序可以使用CRegKey类读写注册表。VB中调用API的办法可以参考QA000226 "如何访问Windows系统注册表"。</p>
		<p>    打开注册键<br />    LONG RegOpenKeyEx( HKEY hKey,  // handle to open key </p>
		<p>    LPCTSTR lpSubKey,              // address of name of subkey to open <br />    DWORD ulOptions,               // reserved =0<br />    REGSAM samDesired,             // security access mask <br />    PHKEY phkResult                // address of handle to open key <br />    );</p>
		<p>    例:<br />    HKEY hd;<br />    hd=HKEY_LOCAL_MACHINE;<br />    char* Regkeyname="SoftWare\\Xy123\\Poker\\";<br />    LONG a=RegOpenKeyEx(hd,Regkeyname,0,KEY_READ,&amp;hd);   //成功返回ERROR_SUCCESS,否则返回错误代码<br /> </p>
		<p>    关闭注册键<br />    LONG RegCloseKey( HKEY hKey // handle to key to close );<br />例:<br />     RegCloseKey(HKEY_LOCAL_MACHINE);<br />OR:  RegCloseKey(hd); <br />建立注册键<br />LONG RegCreateKeyEx( HKEY hKey, // handle to an open key <br />      LPCTSTR lpSubKey, // address of subkey name <br />      DWORD Reserved, // reserved =0<br />      LPTSTR lpClass, // address of class string <br />      DWORD dwOptions, // special options flag <br />      REGSAM samDesired, // desired security access </p>
		<p>      LPSECURITY_ATTRIBUTES lpSecurityAttributes, // address of key security         structure <br />      PHKEY phkResult, // address of buffer for opened handle <br />      LPDWORD lpdwDisposition // address of disposition value buffer );<br />例:<br />   char *sclass="";  //类名指定为空<br />   DWORD nbf=0;    //接受返回值,指明是建立新键还是打开已有的键.(经试验总是返回REG_OPENED_EXISTING_KEY.<br />   LONG II=RegCreateKeyEx(hd,Regkeyname,0,sclass,REG_OPTION_NON_VOLATILE,<br />                KEY_READ|KEY_WRITE,NULL,&amp;hd,&amp;nbf);</p>
		<p>//REG_OPTION_NON_VOLATILE 指明键永久保留.安全结构指明NULL,自动获得一默认值<br />//成功返回ERROR_SUCCESS,否则返回错误代码 <br />枚举键值<br />LONG RegEnumValue( HKEY hKey, // handle to key to query <br />      DWORD dwIndex, // index of value to query <br />      LPTSTR lpValueName, // address of buffer for value string <br />      LPDWORD lpcbValueName, // address for size of value buffer <br />      LPDWORD lpReserved, // reserved =NULL<br />      LPDWORD lpType, // address of buffer for type code </p>
		<p>      LPBYTE lpData, // address of buffer for value data <br />      LPDWORD lpcbData // address for size of data buffer);<br />例:<br />   DWORD dinx=0;<br />   char valuename[70];  //分配数值名称缓冲区<br />   strcpy(valuename,"DeskPattern");  //随便指定哪个键值名<br />   DWORD nsize=69;  //数值名称缓冲区大小<br />   DWORD k=REG_SZ;  //指明数据类型<br />   unsigned char vari[70]; //分配数值缓冲区<br />   DWORD ncbvari=69; //数值缓冲区大小<br />   dinx=0; //从0开始</p>
		<p>   while((II=RegEnumValue(hd,dinx,valuename,&amp;nsize,NULL,&amp;k,vari,&amp;ncbvari)) <br />          != ERROR_NO_MORE_ITEMS)<br />   {<br />       dinx++;//索引 +1,准备取下一个值<br />       nsize=69; //恢复原来大小<br />       ncbvari=69;<br />   }<br />成功后返回值0,各变量返回后设置如下:<br />valuename=数值名称,以0结尾;如 : DeskColor<br />nsize=数值名称长度, 9<br />k=REG_SZ  DeskColor 的类型为 REG_SZ<br />vari=键值,32768 DeskColor="32768",<br />ncbvari=键值长度 REG_SZ包括结尾0,=6, <br />读取键值<br />LONG RegQueryValueEx( HKEY hKey, // handle to key to query </p>
		<p>       LPTSTR lpValueName, // address of name of value to query <br />       LPDWORD lpReserved, // reserved <br />       LPDWORD lpType, // address of buffer for value type <br />       LPBYTE lpData, // address of data buffer <br />       LPDWORD lpcbData // address of data buffer size );<br />例:<br />   RegQueryValueEx(hd,valuename,NULL,&amp;k,vari,&amp;ncbvari);<br />变量定义及成功后各变量设置值同RegEnumValueEx <br />写键值<br />LONG RegSetValueEx( HKEY hKey, // handle to key to set value for <br />       LPCTSTR lpValueName, // name of the value to set </p>
		<p>       DWORD Reserved, // reserved <br />       DWORD dwType, // flag for value type <br />       CONST BYTE *lpData, // address of value data <br />       DWORD cbData // size of value data );<br />例:<br />   strcpy(valuename,"Hello");<br />   unsigned char vari[10];<br />   DWORD k=REG_SZ;<br />   strcpy((char*)vari,"1234567")<br />   RegSetValueEx(hd,valuename,0,k,vari,7);<br />成功后在Poker下增加一个键值 Hello : REG_SZ : 1234567<br />写整型变量：<br />int hi=8;<br />RegSetValueEx(pj,valuename,0,REG_BINARY,(unsigned char*)&amp;hi,sizeof(int));</p>
		<p>成功后在Poker下增加一个键值 Hello2 : REG_BINARY :08 00 00 00</p>
		<p> </p>
		<p>void AddEventSource()<br />{<br />    HKEY hk; <br />    DWORD dwData; <br />    UCHAR szBuf[80]; </p>
		<p>    // Add your source name as a subkey under the Application <br />    // key in the EventLog registry key. </p>
		<p>    if (RegCreateKey(HKEY_LOCAL_MACHINE, <br />            "SYSTEM\\CurrentControlSet\\Services\ <br />            <a href="file://\\EventLog\\Application\\SamplApp">\\EventLog\\Application\\SamplApp</a>", &amp;hk)) <br />        ErrorExit("Could not create the registry key."); </p>
		<p>    // Set the name of the message file. </p>
		<p>    strcpy(szBuf, "%SystemRoot%\\System\\SamplApp.dll"); </p>
		<p>    // Add the name to the EventMessageFile subkey. </p>
		<p>    if (RegSetValueEx(hk,             // subkey handle <br />            "EventMessageFile",       // value name <br />            0,                        // must be zero <br />            REG_EXPAND_SZ,            // value type <br />            (LPBYTE) szBuf,           // pointer to value data <br />            strlen(szBuf) + 1))       // length of value data </p>
		<p>        ErrorExit("Could not set the event message file."); </p>
		<p>    // Set the supported event types in the TypesSupported subkey. </p>
		<p>    dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | <br />        EVENTLOG_INFORMATION_TYPE; </p>
		<p>    if (RegSetValueEx(hk,      // subkey handle <br />            "TypesSupported",  // value name <br />            0,                 // must be zero <br />            REG_DWORD,         // value type <br />            (LPBYTE) &amp;dwData,  // pointer to value data </p>
		<p>            sizeof(DWORD)))    // length of value data <br />        ErrorExit("Could not set the supported types."); </p>
		<p>    RegCloseKey(hk); <br />} </p>
		<p> </p>
		<p>以下代码把注册表自启动shell的键值改写为C:\DK1\ATM\HARP\ExAtmShell.exe:</p>
		<p>         HKEY hkey;<br />LONG res; <br />DWORD datatype=REG_SZ; <br />unsigned char szvalue[_MAX_PATH];<br />strcpy((char*)szvalue,"C:\\DK1\\ATM\\HARP\\ExAtmShell.exe");</p>
		<p>res =::RegOpenKeyEx(HKEY_LOCAL_MACHINE, <br />"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\", 0, <br />KEY_WRITE|KEY_READ, &amp;hkey); </p>
		<p>if(res!=ERROR_SUCCESS)<br />{<br />AfxMessageBox("aaa");<br />return;<br />}<br />res = ::RegSetValueEx(hkey, "Shell", 0, datatype, szvalue, strlen(LPCSTR(szvalue))); </p>
		<p>RegCloseKey(hkey);<br />if(res==ERROR_SUCCESS)<br />::AfxMessageBox("你已经成功地将注册表自启动shell的键值设置为C:\\DK1\\ATM\\HARP\\ExAtmShell.exe");<br />else<br />::AfxMessageBox("设定失败:目标位置不存在这样的键!");</p>
<img src ="http://www.cppblog.com/yishanhante/aggbug/20137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/yishanhante/" target="_blank">jay</a> 2007-03-19 14:47 <a href="http://www.cppblog.com/yishanhante/articles/20137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>