主题:注册表的操作
ydtsh
[专家分:50] 发布于 2007-03-25 11:45:00
我是一个初学者,看过有关注册表操作的文章,但说得都太多了,弄的我完全就不知道是怎么回事
我想问一下,我要在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft 新建一个字符串值应该怎么办,千万别复杂,要有注释和函数原型,拜托啦[em1]
回复列表 (共7个回复)
沙发
香脆饼干 [专家分:2040] 发布于 2007-03-25 13:49:00
#include <windows.h>
#include <stdio.h>
int main()
{
HKEY hKey;
char szValueName[]="MyValueName";
char MyData[]="MyStringData";
LPSTR lpMsgBuf;
/* LONG RegOpenKeyEx(
HKEY hKey, // handle of open key
LPCTSTR lpSubKey, // address of name of subkey to open
DWORD ulOptions, // reserved
REGSAM samDesired, // security access mask
PHKEY phkResult // address of handle of open key
);
*/
//You first get the handle for the key you are going to open
if(ERROR_SUCCESS!=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft",0,KEY_ALL_ACCESS,&hKey))
{
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER ,NULL,GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(char*)&lpMsgBuf,
0,NULL);
MessageBox(NULL,lpMsgBuf,"Get Last Error",MB_OK | MB_ICONEXCLAMATION);
LocalFree(lpMsgBuf);
return -1;
}
/* LONG RegSetValueEx(
HKEY hKey, // handle of key to set value for
LPCTSTR lpValueName, // address of 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
);
*/
//Create a value name called "MyValueName", with the Data type of string and content of "MyStringData".
if(ERROR_SUCCESS!=RegSetValueEx(hKey,szValueName,0,REG_SZ,(BYTE *)&MyData,strlen(MyData)+1))
{
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,NULL,GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(char*)&lpMsgBuf,
0,NULL);
MessageBox(NULL,lpMsgBuf,"Get Last Error",MB_OK | MB_ICONEXCLAMATION);
LocalFree(lpMsgBuf);
return -1;
}
/* LONG RegCloseKey(
HKEY hKey // handle of key to close
);
*/
//You need to close the key after you opened anykey to release the source
//Sorry that last time I forgot to do so.
if(ERROR_SUCCESS!=RegCloseKey(hKey))
{
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,NULL,GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(char*)&lpMsgBuf,
0,NULL);
MessageBox(NULL,lpMsgBuf,"Get Last Error",MB_OK | MB_ICONEXCLAMATION);
LocalFree(lpMsgBuf);
return -1;
}
printf("Successfully add a value under HEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft!");
return 0;
}
/* You only need RegOpenKeyEx, RegSetValueEx and RegClose to satisfy your requirement. */
板凳
ydtsh [专家分:50] 发布于 2007-03-25 18:45:00
很感谢你的回帖,你写得很好,但是有些地方我没有看懂
LPSTR lpMsgBuf; 有什么用吗,我没有打也行,是怎么回事
if(ERROR_SUCCESS!=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft",0,KEY_ALL_ACCESS,&hKey))
中的 KEY_ALL_ACCESS 是访问什么方式
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER ,NULL,GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(char*)&lpMsgBuf,
0,NULL); 有什么用,我在没有打这个也行,是可选的吗??
if(ERROR_SUCCESS!=RegSetValueEx(hKey,szValueName,0,REG_SZ,(BYTE *)&MyData,strlen(MyData)+1)) 中的 strlen(MyData)+1 有什么用,能换成其他的吗,谢谢
我能加你的qq吗 我的qq是281179735,验证时麻烦说明一下是"注册表"
3 楼
aaronwang [专家分:16870] 发布于 2007-03-25 23:31:00
你连代码都看不懂????
补基础....
4 楼
香脆饼干 [专家分:2040] 发布于 2007-03-25 23:44:00
ALL_ACCESS 是完全访问模式,这时用户程序的级别得很高吧。还有其它的模式,如 KEY_QUERY_VALUE,KEY_SET_VALUE,KEY_WRITE,KEY_READ之类。
FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER ,NULL,GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(char*)&lpMsgBuf,
0,NULL);
以上是让系统基于错误ID,找出相应的错误信息,并把它放进系统为我们分配的内存中,最后通过我们传给它的指针的地址,实现char指针的修改,把它指向系统分配的内存空间了。
strlen(MyData)+1 是告诉Window 我给的string有多长,包括NULL character.
楼主感觉可以的话可以查查msdn,它确实是我们大家最好的老师。
5 楼
Yavg [专家分:210] 发布于 2007-03-26 05:17:00
写得很好,可惜我看不懂
6 楼
ydtsh [专家分:50] 发布于 2007-03-26 11:07:00
[quote]你连代码都看不懂????
补基础....[/quote]
高手,注意这里是新手入门区,你是不是进错地方啦!!!![em14]
7 楼
红客猫哥 [专家分:0] 发布于 2007-03-29 15:09:00
QQ群:4712525 欢迎各位编程大虾,老鹰级人物进入研究,指导!
我来回复