网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.autoconf 和automake生成Makefil.
.BCB利用组件传送文件.
.数据结构辅导---栈和队列(2).
.C宏--智者的利刃,愚者的恶梦.
.Windows Sockets:从套接字类派生.
.C++ 类的静态成员(static).
.WinHelp API命令方法.
.数据结构综述.
.全屏幕编辑软件的编写(C语言)01.
.C++习题与解析(重载-03).
.通过并行机制处理鼠标和键盘.
.编辑器的改进.
.TServerSocket和TClientSocket的.
.COM编程入门2.
.VC++编程隐藏计算机中的鼠标.
.在DOS下使用Windows *.WAV 文件.
.一个画抛物线的程序.
.I/O端口读写的实现.
.C++中的虚函数(1).
.Bjarne:如何对付内存泄漏?.

程序配置信息的保存

发表日期:2008-3-8


    在我们编写的每一个程序中,我们都要保存一些有用的信息,如何保存这些信息呢?比较常用的有三种方法,一种是使用注册表,一种是使用Ini文件,还有就是使用文件。采用那种方法保存配置信息,不同的人可能有不同的习惯,这三种方法那种最适合你的程序呢,究竟那个最方便呢?

一、使用注册表
    在BCB中有个TRegistry,它提供了方便的注册表操作,它有几个重要的属性和方法。如下:
    __property HKEY RootKey = {read=FRootKey, write=SetRootKey, nodefault};
    这个属性用来设置和取得当前的根键。在默认情况下它的值是HKEY_CURRENT_USER。
    这个属性是我们经常用到的。
    bool __fastcall OpenKey(const AnsiString Key, bool CanCreate);
    这个方法用来打开一个键,bool CanCreate是表示假如这个键不存在则是否创建这个键,true是创建。假如打开成功返回true。
    void __fastcall CloseKey(void);
    这个方法关闭当前打开的键,当你完成注册表的修改后,应该调用此方法来保存您的修改。
    bool __fastcall KeyExists(const AnsiString Key);
    这个方法判定一个键是否存在。
    bool __fastcall ValueExists(const AnsiString Name);
    这个方法判定当前键下是否存在指定的数据项。
    AnsiString __fastcall ReadString(const AnsiString Name);
    这个方法从当前键下指定的数据项读取一个字符串。
    void __fastcall WriteString(const AnsiString Name, const AnsiString Value);
    这个方法向当前键下指定的数据项写入一个字符串。类似的函数还有ReadInteger,WriteInteger,ReadBool,WriteBool等方法,这里就不一一列举了,请大家看一下在线帮助就可以了,下面我举一个使用注册表保存和读取程序配置信息的例子来说明如何用注册表读取和保存程序的配置信息。
    下面这个例子从HKEY_LOCAL_MACHINE\\Software\\MyInfo键下读取配置信息,假如程序是第一次运行则建立这个键。(使用TRegistry类,需要包含Registry.hpp)
    #include <Registry.hpp>

    void __fastcall ReadConfig ()
    {
      TRegistry * reg = new TRegistry();
      reg->RootKey = HKEY_LOCAL_MACHINE;
      if ( reg->OpenKey ( "\\Software\\MyInfo", true  ) )
      {//打开HKEY_LOCAL_MACHINE\\Software\\MyInfo键假如不存在则创建
        if ( reg->ValueExists ( "DataPath" ) )
        {//判定是否存在DataPath这个数据项,存在则读取
          SysConfig.DataPath = reg->ReadString ( "DataPath" );
        }else{//假如不存在这个数据项则采用程序默认路径
          SysConfig.DataPath = DefaultPath;
        }
      }

      reg->CloseKey();//关闭打开的键。
      delete reg;
    }
    下面这个例子是保存信息到注册表,假如不存在这个键则创建并保存。
    void __fastcall SaveConfig ()
    {
      TRegistry * reg = new TRegistry();
      reg->RootKey = HKEY_LOCAL_MACHINE;
      if ( reg->OpenKey ( "\\Software\\MyInfo", true  ) )
      {//打开HKEY_LOCAL_MACHINE\\Software\\MyInfo键假如不存在则创建
        reg->WriteString ( "DataPath", SysConfig.DataPath );
      }
      reg->CloseKey();//关闭打开的键并保存信息
      delete reg;
    }
    这两个例子很简单,其它的一些读写方法也和读取和写入String差不多,大家可以试试。

    使用注册表要注重的问题。

        使用注册表保存配置信息是多数软件所采用的方法,用注册表的优点是用户轻易不能够取得和修改这些配置信息,能够有一定的安全性和隐蔽性,假如你采用二进制方式写入的话,用户将很难知道你保存的数据内容,这样可以使你的数据更安全它的缺点就是你要注重在Windows的不同版本下,注册表的结构是不同的,而且在NT和WIN2000下,假如权限不够有些键系统是不答应你访问的。再就是用户很讨厌软件在它的注册表里写
入一些东西。这也就是流行的绿色软件之说了。

二、使用INI配置文件

    在BCB中有个TIniFile类,它提供了对INI文件的操作,INI文件一种通用的配置文件格式它也象注册表一样分键和数据项,下面是一个INI配置文件的内容,它有一个键LastConfig,在这个键下有一个数据项DefaultDit,在数据项后面就是这个数据项的值。
  [LastConfig]
  DefaultDir=E:\xxx
  TIniFile类有几个常用的方法给大家介绍一下:
  __fastcall TIniFile(const AnsiString FileName) : Inifiles::TCustomIniFile(FileName) { }
  这个方法创建一个INI对象,假如FileName指定的文件名不存在则自动生成此文件,FileName可以用全路径,指定INI文件的地点,假如只有文件名没有路径,这个函数将到Windows系统路径下去打开或创建。(WIN9X是Windows目录,NT和2000是WINNT目录)
  bool __fastcall SectionExists(const AnsiString Section);
  这个方法判定是否存在Section这个键。
  virtual AnsiString __fastcall ReadString(const AnsiString Section, const AnsiString Ident, const AnsiString Default);
  这个方法从INI文件中读取一个字符串,Section是指定的键,Ident是指定键下的数据项Default是假如这个项不存在的时候的默认值。
  virtual void __fastcall WriteString(const AnsiString Section, const AnsiString Ident, const AnsiString Value);
  这个方法是向INI文件中写入一个字符串,Senction是指定的键,Ident是指定的数据项,Value是要写入的数据。同TRegistry一样,TIniFile类还提供了读取整型、布尔型,二进制等数据类型的读写方法,大家看看联机帮助就可以了,用法基本一样。下面就那上面的INI文件为例来说明一下如何有INI文件来保存配置信息和如何从INI文件中读取数据。

  下面的例子是如何从一个INI文件中读取配置,此配置文件保存在应用程序的目录下,假如没有配置,则取程序所在路径为默认值。


  #include <inifiles.hpp>

  void __fastcall ReadConfig ()
  {
   //读取配置,
    TIniFile * regKey;
    AnsiString ExePath = ExtractFileName( ParamStr ( 0 ) );
    regKey = new TIniFile ( ExePath + "TrimTxt.ini");
    DefaultDir=regKey->ReadString("LastConfig","DefaultDir",ExePath );
    delete regKey;
  }

  下面的例子说明如何将信息写入INI文件

  void __fastcall SaveConfig ()
  {
    TIniFile * regKey;
    AnsiString ExePath = ExtractFileName( ParamStr ( 0 ) );
    regKey = new TIniFile ( ExePath + "TrimTxt.ini");
    regKey->WriteString ( "LastConfig", "DefaultDir" , DefaultDir );
    de
上一篇:程序设计语言 人气:339
下一篇:初级 Windows API C++语言版 编程(3) 人气:627
浏览全部C/C++的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐