zoukankan      html  css  js  c++  java
  • VC++ MFC中如何将应用程序的配置信息保存到注册表中(一)

     

    注册表(Registry,繁体中文版Windows称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。比如我们打开一个记事本,调整其窗口大小,使用完毕后关闭记事本,下次打开时大小和上次关闭前的大小和在屏幕上的位置是相同。这些位置和大小信息就是在记事本关闭时保存到注册表中,下次打开时我们从注册表中取出这些数据,并按照这些数据显示记事本程序的大小和位置信息。

    下面教你如何使用GetProfileInt,WriteProfileInt,GetProfileString,WriteProfileString,SetRegistryKey这5个函数把你想要保存的应用程序信息保存到注册表中,如何从注册表中取出来。

    UINT WINAPI GetProfileInt( LPCTSTR lpAppName,  LPCTSTR lpKeyName, int nDefault);
    
    BOOL WriteProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int nValue);
    
    BOOL WINAPI WriteProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString);
    
    BOOL WriteProfileInt(LPCTSTR lpszSection,LPCTSTR lpszEntry,int nValue );

    上面4个函数是CWinApp类中提供了一组用于读写应用程序配置的方法的接口,可方便的用于读写应用程序配置。具体的函数声明和参数解释可以参考MSDN。

    下面就教你如何才能够把你想要保存的一些信息保存到注册表中。

    1.    用VC++的向导建立基于对话框的MFC项目之后,在CClassApp::InitInstance()函数定义中添加这样的语句:

    SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

    该函数将为以上提到的几个方法建立工作环境,此时如果用WriteProfileInt写入数据,将会被写入到如下注册表位置:

    HKEY_CURRENT_USERSoftware应用程序向导生成的本地应用程序应用程序名称

    你可以打开注册表查看一下是否有了对应的键值项。

    如果在InitInstance中不执行SetRegistryKey,则用WriteProfileInt写入数据时,将写入到%windir%应用程序名称.ini中。

    2.    向注册表中写入需要保存的数据

    a.   如果在InitInstance中执行了SetRegistryKey("应用程序向导生成的本地应用程序");    则对于:

    WriteProfileInt("section","val1",10);

    将在注册表中如下路径写入数据:
    [HKEY_CURRENT_USERSoftware应用程序向导生成的本地应用程序应用程序名称section]      "val1"=dword:0000000a

    b.   如果在InitInstance中没执行SetRegistryKey 则对于:

    WriteProfileInt("section","val1",10);

    将在“%windir%测试应用程序.ini”中写入:
    [section] 

    val1=10

    3.从注册表中读取需要的值

    GetProfileInt("section","val1",10);

    最后一个参数是默认值,如果没有从注册表中取得任何值,将使用这个默认的值。

    对于取得字符串类型的值用法大致相同使用的是GetProfileString和WriteProfileString接口。

    下面是一个测试例程,你可以放到工程中测试一下!

    先在CTestClassApp::InitInstance()中添加SetRegistryKey函数

    BOOL CTestClassApp::InitInstance()
    {
        SetRegistryKey(_T("Test Regedit Solutions"));
    
        AfxEnableControlContainer();
        .............  //此处代码省略
        .............
        return FALSE;
    }

    可以在对话框的OK按钮的响应函数中添加下面的测试代码

    void CTestClassDlg::OnOK() 
    {    
        AfxGetApp()->WriteProfileInt("Settings", "Int", 21);
        AfxGetApp()->WriteProfileString("Settings", "String", _T("Welcome you come here!")); 
    
        int nGetInt = AfxGetApp()->GetProfileInt("Settings", "Int", 21);
        CString strGetString = AfxGetApp()->GetProfileString("Settings", "String", _T("Welcome you come here!")); 
    
        TCHAR szBuffer[256];
        wsprintf(szBuffer,_T("int:%d  string:%s"),nGetInt,strGetString);
    
        AfxMessageBox(szBuffer);
        //CDialog::OnOK();
    }

    运行程序点击OK按钮弹出对话框

    取得的值和我们程序中写入的值相同。

    让后在查找程序中输入regedit打开注册表,按上面的路径找到响应的位置,查看键值和对应的数据如下图所示

    发现保存的值也是正确的。

    有了这些我们就可以在注册表中保存我们需要保存的一些简单的程序配置信息数据了。

  • 相关阅读:
    3.30一周拾遗
    3.25周 一周拾遗
    自动加载以及Composer的实现
    MySQL 事务处理
    PHP代码实现3 [函数角度]
    PHP代码实现2 [从变量和数据的角度] 1
    PHP代码实现2 [从变量和数据的角度] 2
    vue 报错: [Vue warn]: Error in nextTick: "RangeError: Maximum call stack size exceeded" 很可能是你的name错了
    vue电商开发记录1—实现电商图片放大镜,移入放大效果
    vue图片点击放大预览v-viewer
  • 原文地址:https://www.cnblogs.com/lujin49/p/4742616.html
Copyright © 2011-2022 走看看