none
我的这个程序问题出在哪里?7天了,还是不懂! RRS feed

  • 问题

  • 一个关于注册表修改的问题,修改的注册表:
    [HKEY_CURRENT_USER\Software\Microsoft\Notepad]
    "fWrap"=dword:00000000(作用是win7文本文档自动换行!将键值修改为1!)
    思路:自定义一个注册表,重写注册表打开函数和注册表关闭函数(调用微软自身的API函数,省略其中的一些参数)!
    问题:程序可以编译通过,可以运行,就是修改不了注册表的键值,也就是说不起作用!你能看出来问题出在哪里吗?

    开发环境:VS2008/Windows 7 Ultimate X64
    以下是直接调用系统API成功修改注册表程序,帮助你思考!
    #include<iostream>
    #include<windows.h>
    #include<winreg.h>
    using namespace std;
    void main()
    {
    HKEY RootKey=HKEY_CURRENT_USER;
    LPCTSTR KeyName="Software\\Microsoft\\Notepad";
    LPCTSTR KeyValue="fWrap";
    int szValue[1]={1};
    long result_key=::RegOpenKeyEx(RootKey,KeyName,0,KEY_SET_VALUE,&RootKey);
    long result_Key_value=::RegSetValueEx(RootKey,KeyValue,0,REG_DWORD,(CONST BYTE*)szValue,4);
    long result_reg=::RegCloseKey(RootKey);
    if(result_key==0&&result_Key_value==0&&result_reg==0)
    cout<<"修改成功!"<<endl;
    }

    以下是问题程序的代码:
    自定义的头文件:
    #include<windows.h>
    #include<winreg.h>
    #pragma once
    class CRegEdit
    {
    public:
    HKEY FKey;
    LPCTSTR SKey;
    DWORD KeyType;
    public:
    CRegEdit(void);
    ~CRegEdit(void);
    bool OpenKey(HKEY FKey,LPCTSTR SKey);
    bool CloseKey(HKEY FKEY);
    };


    头文件的实现代码:
    #include<windows.h>
    #include<winreg.h>
    #include "RegEdit.h"
    CRegEdit::CRegEdit(void)
    {
    HKEY FKey=NULL;
    LPCTSTR SKey=NULL;
    }
    CRegEdit::~CRegEdit(void)
    {
    if(FKey!=NULL)
    ::RegCloseKey(FKey);
    }
    bool CRegEdit::OpenKey(HKEY FKey,LPCTSTR SKey)
    {
    if(ERROR_SUCCESS==::RegOpenKeyEx(FKey,SKey,0,KEY_ALL_ACCESS,&FKey))
    return 0;
    else return 1;
    }
    bool CRegEdit::CloseKey(HKEY FKey)
    {
    if(ERROR_SUCCESS==::RegCloseKey(FKey))
    return 0;
    else return 1;
    }



    主程序代码:
    #include<iostream>
    #include<windows.h>
    #include<winreg.h>
    #include"RegEdit.h"
    using namespace std;
    void main()
    {
    int szValue[1]={1};
    CRegEdit regdit1;//定义的对象regedit1
    int a=1,b=1,c=1;
    regdit1.FKey=HKEY_CURRENT_USER;
    regdit1.SKey="Software\\Microsoft\\Notepad";
    a=regdit1.OpenKey(regdit1.FKey,regdit1.SKey);
    cout<<a<<endl;
    long result_Key_value=::RegSetValueEx(regdit1.FKey,regdit1.SKey,0,REG_DWORD,(CONST BYTE*)szValue,4);
    cout<<result_Key_value<<endl;
    b=regdit1.CloseKey(regdit1.FKey);
    cout<<b<<endl;
    system("pause");
    }

    要求:不重写我的问题程序,指出问题的所在!我的一个大学老师把我的程序修改的面目全非之后还是没有解决,最后我看到场面比较尴尬,就借口让他不解决了!另一个更惨,根本不会API编程!他们都是教C++课!
    2012年5月16日 9:27

答案

  • bool CRegEdit::OpenKey(HKEY& FKey,LPCTSTR SKey) { if(ERROR_SUCCESS==::RegOpenKeyEx(HKEY_CURRENT_USER,SKey,0,KEY_ALL_ACCESS,&FKey)) return 1; else return 0; }

    void main()
    {
     //int szValue[1]={1};
     DWORD szValue = 1;
     CRegEdit regdit1;
     int a=1,b=1,c=1;
     regdit1.FKey=NULL;
     regdit1.SKey="Software\\Microsoft\\Notepad";
     LPCTSTR KeyValue="fWrap";
     
     a=regdit1.OpenKey(regdit1.FKey,regdit1.SKey);
     cout<<a<<endl;
     long result_Key_value=::RegSetValueEx(regdit1.FKey,KeyValue,0,REG_DWORD,(CONST BYTE*)&szValue, sizeof(szValue));
     cout<<result_Key_value<<endl;
     
     b=regdit1.CloseKey(regdit1.FKey);
     cout<<b<<endl;
     system("pause");
    }


    主要修改类的这个成员函数,类里这个函数的申明也需要修改一下,main函数里调用地方需要修改一下即可。另外代码里注意一个Unicode编码的问题。您默认设置的多字节编码吧。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已标记为答案 Helen Zhao 2012年5月23日 9:27
    2012年5月16日 14:12
    版主