/ Reg.h: interface for the CReg class.
//
//////////////////////////////////////////////////////////////////////#if !defined(AFX_REG_H__9E88130A_F001_48DD_A950_2861BB96A6B7__INCLUDED_)
#define AFX_REG_H__9E88130A_F001_48DD_A950_2861BB96A6B7__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000class CReg  
{
private:
HKEY m_hKey;
public:
CReg();
CReg(HKEY hKey,LPCTSTR lpSubKey);
LONG OpenKey(HKEY hKey,LPCTSTR lpSubKey);
LONG DelSubKey(LPCTSTR lpSubKey);
LONG CloseKey();
LONG CreateKey(HKEY hKey,LPCTSTR lpSubKey);
LONG DeleteValue(LPCTSTR lpValueName);
LONG SetValue(LPCTSTR lpValueName,DWORD dwType,LPCTSTR lpData);
LONG QueryValue(LPCTSTR lpValueName,CString& Buffer); virtual ~CReg();
};#endif // !defined(AFX_REG_H__9E88130A_F001_48DD_A950_2861BB96A6B7__INCLUDED_)// Reg.cpp: implementation of the CReg class.
//
//////////////////////////////////////////////////////////////////////#include "stdafx.h"
#include "gfg.h"
#include "Reg.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CReg::CReg()
{
m_hKey=0;
}CReg::CReg(HKEY hKey,LPCTSTR lpSubKey)
{
m_hKey=0;
RegOpenKey(hKey,lpSubKey,&m_hKey);
}CReg::~CReg()
{
CloseKey();
}LONG CReg::OpenKey (HKEY hKey,LPCTSTR lpSubKey)
{
ASSERT(!m_hKey);
LONG result=RegOpenKey(hKey,lpSubKey,&m_hKey);
return result;
}LONG CReg::DelSubKey(LPCTSTR lpSubKey)
{
ASSERT(m_hKey);
LONG result=RegDeleteKey(m_hKey,lpSubKey);
return result;
}LONG CReg::CloseKey()
{
LONG result=RegCloseKey(m_hKey);
return result;
}LONG CReg::CreateKey (HKEY hKey,LPCTSTR lpSubKey)
{
ASSERT(!m_hKey);
LONG result=RegCreateKey (hKey,lpSubKey,&m_hKey);
return result;
}LONG CReg::DeleteValue(LPCTSTR lpValueName)
{
ASSERT(m_hKey);
LONG result=RegDeleteValue(m_hKey,lpValueName);
return result;
}LONG CReg::SetValue(LPCTSTR lpValueName,DWORD dwType,LPCTSTR lpData)
{
ASSERT(m_hKey);
DWORD cbData;
switch (dwType)
{
case REG_SZ:
cbData=strlen(lpData);
break;
case REG_DWORD:
cbData=4;
break;
case REG_BINARY:
ASSERT(0);
}
LONG result=RegSetValueEx(m_hKey,lpValueName,NULL,dwType,(CONST BYTE*)lpData,cbData);
return result;
}LONG CReg::QueryValue(LPCTSTR lpValueName,CString& Buffer)
{
ASSERT(m_hKey);
DWORD dwType=0;
DWORD dwSize=0;
DWORD cbData=0;
LONG result=RegQueryValueEx(m_hKey,lpValueName,NULL,&dwType,(BYTE*)0,&dwSize);
if(result==ERROR_SUCCESS)
{
if(dwType==REG_SZ)
RegQueryValueEx(m_hKey,lpValueName,NULL,&dwType,(BYTE*)Buffer.GetBuffer(dwSize),&dwSize);
if(dwType==REG_DWORD)
{
RegQueryValueEx(m_hKey,lpValueName,NULL,&dwType,(BYTE*)&cbData,&dwSize);
Buffer.Format ("%d",cbData);
}
ASSERT(dwType!=REG_BINARY);
}
return result;
}

解决方案 »

  1.   

    个人认为,你的QueryValue成员函数不应该由一个CString的对象接收数据。
    我觉得参考VCL的设计较好,即有一个由LPBYTE指针指向的缓冲区接收数据的GetData成员函数,然后再分别由成员函数ReadString、ReadInteger等(在其中调用GetData)来取得各个不同类型的数据。
      

  2.   

    最好有一个m_bInitial变量之类的,给你一个我写的,可以直接和控件变量邦定
    在ID_OK中直接调用Flush()就行了。
    有四个类,CRegInt是DWORD和int的;
    CRegText是CString可读写的,CRegStatic是只读的CString CRegBin是二进制的,
    这里只给出CRegText吧,如果要别的发一个Email到[email protected]我会寄去的^-^// RegText.h: interface for the CRegText class.
    //
    //////////////////////////////////////////////////////////////////////#if !defined(AFX_REGTEXT_H__F16B982B_F210_4552_8DEA_4BA0D5FB32E7__INCLUDED_)
    #define AFX_REGTEXT_H__F16B982B_F210_4552_8DEA_4BA0D5FB32E7__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    #include "atlbase.h"
    #include "white magic.h"class CRegText : public CObject  
    {
    public:
    CString* m_pstrData;
    LPCTSTR m_szValue;
    DWORD Create(CString* pstrData,HKEY ParKey,LPCTSTR Key,LPCTSTR  Value);
    CRegText();
    virtual ~CRegText();
    CRegText(CString* pstrData,HKEY ParKey,LPCTSTR Key, LPCTSTR Value);
    long FlushKey();
    bool m_IsInitial;
    CRegKey m_rkRegKey;private:
    };#endif // !defined(AFX_REGTEXT_H__F16B982B_F210_4552_8DEA_4BA0D5FB32E7__INCLUDED_)
    // RegText.cpp: implementation of the CRegText class.
    //
    //////////////////////////////////////////////////////////////////////#include "stdafx.h"
    #include "white magic.h"
    #include "RegText.h"#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif//////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////CRegText::CRegText()
    {
    m_IsInitial=false;
    }CRegText::~CRegText()
    {}CRegText::CRegText(CString* pstrData,HKEY ParKey,LPCTSTR Key, LPCTSTR Value)
    {
    DWORD dwCount=MAX_BUFFER;
    char Buffer[MAX_BUFFER-1];
    if(!m_IsInitial)
    {
    m_rkRegKey.Open(ParKey,Key);
    m_rkRegKey.QueryValue(Buffer,Value,&dwCount);
    *pstrData=Buffer;
    if(!dwCount)
    ::memset((void*)Buffer,0,MAX_BUFFER);
    m_szValue=Value;
    m_IsInitial=true;
    }

    }long CRegText::FlushKey()
    {
    if(m_IsInitial)
    m_rkRegKey.SetValue(*m_pstrData,m_szValue); return true;
    }DWORD CRegText::Create(CString *pstrData, HKEY ParKey, LPCTSTR Key, LPCTSTR Value)
    {
    // CRegText(pstrData,ParKey,Key,Value);
    DWORD dwCount=MAX_BUFFER;
    char Buffer[MAX_BUFFER]; if(!m_IsInitial)
    {
    ::memset(Buffer,NULL,MAX_BUFFER);
    m_rkRegKey.Open(ParKey,Key);
    m_rkRegKey.QueryValue(Buffer,Value,&dwCount);
    if(!dwCount)
    ::memset((void*)Buffer,0,MAX_BUFFER); *pstrData=Buffer;
    m_IsInitial=true;
    m_szValue=Value;
    m_pstrData=pstrData;
    } return true;
    }
    请大家支持!
      

  3.   

    http://xmsoft.xiloo.com
    这是一款很好的电脑辅助工具。包括以下几大功能:·文件粉碎 ·文件分割·文件合并·生成网页索引·文本文件转成网页文件·简繁体转换·注册表修复等