(1)打开注册表,读写之前都要进行此操作
HKEY hKEY; //定义一个hkey句柄
//打开与IRM相关的hKEY,访问注册表,hkey则保存函数所打开的键的句柄
long ret = RegOpenKeyEx
(
HKEY_LOCAL_MACHINE, //需要打开的主键的名称
REG_IRM_ROOT, //需要打开的子键的名称,如 “SOFTWARE\\IRM";
0, //目前保留
KEY_WRITE, //以什么方式打开 ,这里以写的方式
&hKEY //得到将要打开键的句柄
);
if(ret!=ERROR_SUCCESS) //如果无法打开hkey,则终止程序的执行
{
AfxMessageBox("错误:无法打开有关的hKey");
return;
}
(2)修改注册表的项,若项存在,则修改其值;若不存在,则添加此项
//这里读的是IP地址,m_editIP是ip地址控件的变量
BYTE IP0, IP1, IP2, IP3;
m_editIp.GetAddress(IP0, IP1, IP2, IP3);
DWORD dwtype = REG_SZ; //定义数据类型
char strIP[16]={0};
sprintf(strIP, "%d.%d.%d.%d", IP0, IP1, IP2, IP3);
int ip_len = strlen(strIP);
DWORD dwsize = ip_len;
//设置
long ret1 = RegSetValueEx(
hKEY, //刚打开注册表获得的打开键句柄
REG_IRM_SERVERIP, // 这个键下的子键名称,如IRM下的serverip项
NULL, //保留,设为空
dwtype, //子项的数据类型
(LPBYTE)strIP, //子键值得第一个字节地址
dwsize //子键值得长度
);
if(ret1 != ERROR_SUCCESS)
{
//AfxMessageBox("错误:无法打开有关的hKey");
Pdlg.m_strvalue = "获取IP注册表信息失败,请重试!";
Pdlg.m_btnPopup.LoadStdImage(IDB_PNG_INFICON, _T("PNG"));
Pdlg.DoModal();
return;
}
(3)读取注册表信息
int ret =RegOpenKeyEx(
HKEY_LOCAL_MACHINE, //要打开的主键名称
REG_IRM_ROOT, //要打开的子键名称
0, //保留,设为0
KEY_READ, //以读的方式打开
&hKey //获得打开键的句柄
)
if(ret != ERROR_SUCCESS)
{
DEBUGMSG(DEBUG_UI_MSG, (_T("Open %s registry failed:%d\n"), REG_IRM_ROOT, GetLastError()));
return FALSE;
}
//读项的值
DWORD dwType = 0;
DWORD dwSize = 0;
HKEY hKey = NULL;
BOOL bRet = TRUE;
dwType = REG_SZ;
dwSize = 128*sizeof(TCHAR);
RegQueryValueEx(
hKey, //打开键的句柄
REG_IRM_SERVERIP, //项的名称
NULL, //保留,设为null
&dwType, //设置项的数据类型
(LPBYTE)NULL, //项的值,暂时为null
&dwSize //项的长度
);
int ret = RegQueryValueEx(hKey,
REG_IRM_SERVERIP,
NULL,
&dwType,
(LPBYTE)&g_strServerIP[0], //准备好的buffer的首地址接收项值
&dwSize // buffer的长度,根据项的类型buffer的类型也应该不同
)
(4)关闭注册表
RegCloseKey(hKey);