Win.ini和注册表的读取写入
最近在做打包的工作,应用程序的配置信息可以放在注册表文件中,但是在以前的16位操作系统下,配置信息放在Win.ini文件中。下面介绍一下Win.ini文件的读写方法和注册表的编程。
先介绍下Win.ini,,win.ini是Windows系统的一个基本系统配置文件。WIN.INI文件包含若干小节,每一节由一组相关的设定组成。文件配保存了诸如影响Windows操作环境的部分、控制系统界面显示形式及窗口和鼠标器的位置、联结特定的文件类型与相应的应用程序、列出有关HELP窗口及对话窗的默认尺寸、布局、文本颜色设置等等的选项。是系统配置不可缺少的文件。
Win.ini文件的读写
PlatForm SDK的WriteProfileString()函数可以写入一个字符串到Win.ini文件的制定段中
PlatForm SDK的GetProfileString()函数可以从Win.ini文件中获得指定的段中制定键的字符串信息。
往WIN.ini文件中写入内容和读取信息 ::WriteProfileString("name","dengyongbo","25"); char ch[100]; ::GetProfileString("name","dengyongbo","xiaoming",ch,100); AfxMessageBox(ch);
注册表编程
但是CWinApp类的成员函数WriteProfileString()函数可以写入一个字符串到注册表的指定段中
但是CWinApp类的成员函数GetProfileString()函数可以从注册表中获得指定目录下的指定段的字符串信息。 往注册表中写入内容和读取信息
WriteProfileString("name","dengyongbo","25"); CString str; str=GetProfileString("name","dengyongbo"); AfxMessageBox(str);
注意:在应用程序类的InitInstance()函数中,有一条如下的代码:SetRegistryKey(_T("Local AppWizard-Generated Applications"));我们上面往注册表中写入的美容都在Local AppWizard-Generated Applications目录下可以找到,我们可以重写这条语句,建立我们自己的目录。
在注册表编程之前,需要了解一下注册表中某一项的存放形式,每一条注册表项由名称、类型、数据三部分构成,如下图所示:
其中需要注意的是,上面两条注册表项的内容是很不一样的,首先在二者的名称上一种是没有名称的一种是有名称的;其次二者的类型也不同REG_SZ是一种普通的类型,除此之外还有REG_DWORD、REG_DWORD_LITTLE_ENDIAN等很多类型。以上区别需要用不同的方法向注册表中写入以上内容。
(1)读写无名称的注册表数据
<1>RegCreateKey()在指定目录下创建注册表项
<2>RegSetValue()往指定的注册表项中添加数据。注意:该函数只能添加无名称的类型为REG_SZ的数据
<3>RegCloseKey()关闭注册表项
<4>RegQueryValue()获取注册表中指定项的数据。该函数的第三个参数为空第四个参数不为空的话可以用第四个参数返回注册表中指定项的数据的长度,因此可以通过连续调用两次该函数巧妙完成注册表的读写,合理分配内存大小。示例代码如下:
************************************************************************** 往注册表中写入内容无名称并且类型为REG_SZ的数据 *************************************************************************/
HKEY hkey;
RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\dengyongbo\age",&hkey);
RegSetValue(hkey,NULL,REG_SZ,"25",NULL);
RegCloseKey(hkey);
************************************************************************** 从注册表中读取无名称并且类型为REG_SZ的数据 *************************************************************************/
char* pBuf; long lvalue;
RegQueryValue(HKEY_LOCAL_MACHINE,"SOFTWARE\dengyongbo\age",NULL,&lvalue);
pBuf=new char[lvalue];
RegQueryValue(HKEY_LOCAL_MACHINE,"SOFTWARE\dengyongbo\age",pBuf,&lvalue); MessageBox(pBuf);
(2)读写有名称的并且各种类型的注册表数据
<1>RegCreateKey()在指定目录下创建注册表项
<2>RegSetValueEx()往指定的注册表项中添加数据。注意:该函数能添加有名称和无名称以及各种类型的注册表数据
<3>RegCloseKey()关闭注册表项
<4>RegOpenKey()在读有名称的注册表数据时需先打开注册表
<5>RegQueryValueEx()接收有名称和各种类型的注册表数据
示例代码如下:
/************************************************************************** 往注册表中写入有名称和各种类型的数据 *************************************************************************/
HKEY hkey; DWORD dwage=30;
RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE\dengyongbo\age",&hkey);
RegSetValueEx(hkey,"bobo",0,REG_DWORD,(const BYTE*)&dwage,4);
RegCloseKey(hkey);
/************************************************************************** 从注册表中读取有名称和各种类型的数据 *************************************************************************/
HKEY hkey; DWORD dwtype; DWORD dwvalue; DWORD dwage; RegOpenKey(HKEY_LOCAL_MACHINE,"SOFTWARE\dengyongbo\age",&hkey); RegQueryValueEx(hkey,"bobo",0,&dwtype,(LPBYTE)&dwage,&dwvalue); CString str; str.Format("age=%d",dwage); MessageBox(str);
打包程序的时候,文件安装的路径要写入win.ini中,不然打开安装的程序会报Select Data Source的问题。若是在Installshield中的工程中修改了安装路径,不要忘了在读写win.ini的地方也修改。
更多关于注册表操作的函数请参看MSDN。
- javascript闭包
- 【LeetCode 438】关关的刷题日记37 Find All Anagrams in a String
- 还在手动给css加前缀?no!几种自动处理css前缀的方法简介
- 算法模板——线段树5(区间开根+区间求和)
- Spring基础篇——通过Java注解和XML配置装配bean
- Java多线程高并发学习笔记(二)——深入理解ReentrantLock与Condition
- 算法模板——线段树1(区间加法+区间求和)
- 【LeetCode 205】关关的刷题日记38 Isomorphic Strings
- JavaScript基础2---控制权DOM操作
- 算法模板——线段树3(区间覆盖值+区间求和)
- 算法模板——线段树4(区间加+区间乘+区间覆盖值+区间求和)
- 【LeetCode 204】关关的刷题日记39 Count Primes
- 算法模板——并查集 1
- Java 持久化操作之 --io流与序列化
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法