vs2013 MFC自己封裝的CMyKey類

從vc6.0轉到vs2013,原先都是ANSI字符編碼,現在vs默認的是Unicode編碼。MessageBox("test");都要改成MessageBox(_T("test"));很麻煩!其他方面就不說了。

看到推酷的一篇文章 http://www.tuicool.com/articles/IbEZBr 《對多字節字符編碼的支持》是從http://blog.csdn.net/xinzhiyounizhiyouni/article/details/20617981轉的。

這句是重點:使vs2013支持多字節字符,這個就需要下載和安裝一個文件 http://pan.baidu.com/s/1Acu6M。然後:在項目屬性中,把字符集改成多字節字符集。

搞定編碼了,接下來就是介紹CMyKey類。

// MyKey.h: interface for the CMyKey class.
//Author:阮家友
//時  間:
//QQ:1439120442
//我是個技術宅,歡迎交流

#pragma once

class CMyKey  
{
public:
	CMyKey();
	virtual ~CMyKey();
public:
    //修改項 不存在則新建
    BOOL WriteK(HKEY RootKey /*根鍵*/, CString path /*路徑*/, CString strName /*字符串名稱*/, CString str /*要寫入的字符串*/);
    BOOL WriteK(HKEY RootKey /*根鍵*/, CString path /*路徑*/, CString ValueName /*數值名稱*/, DWORD value /*數值型*/);
    //獲取值
    BOOL GetK(HKEY RootKey /*根鍵*/, CString path /*路徑*/, CString strName /*字符串名稱*/, char *pStr /*要保存的字符串對象地址*/);
    BOOL GetK(HKEY RootKey /*根鍵*/, CString path /*路徑*/, CString strName /*數值名稱*/, DWORD &pValue /*要保存的數值變量地址*/);
    //刪除項
    BOOL DelK(HKEY RootKey /*根鍵*/, CString path /*路徑*/, CString strName /*子項名稱*/);
};

// MyKey.cpp: implementation of the CMyKey class.
//Author:阮家友
//時  間:2015年9月24日13:07:40
//    QQ:1439120442
//我是個技術宅,歡迎交流

#include "stdafx.h"
#include "MyKey.h"

CMyKey::CMyKey()
{

}

CMyKey::~CMyKey()
{

}
//創建項
//返回1代表成功;返回0代表失敗
BOOL CMyKey::WriteK(HKEY RootKey /*根鍵*/, CString path /*路徑*/,CString strName /*字符串名稱*/, CString str /*要寫入的字符串*/)
{
    HKEY newkey;
    if(ERROR_SUCCESS==RegOpenKey(RootKey,path,&newkey))
    {
        char *pData=NULL,strArr[MAX_PATH];
        pData=(LPSTR)(LPCSTR)str;
        strcpy_s(strArr,pData);
        //新建字符串項
        if(ERROR_SUCCESS==RegSetValueEx(newkey,strName,NULL,REG_SZ,(unsigned char*)strArr,sizeof(strArr)))
        {
			RegCloseKey(newkey);
			return true;
		}
		else
		{
			RegCloseKey(newkey);
			return false;
		}
    }
    else
    {
        return false;
    }
}
BOOL CMyKey::WriteK(HKEY RootKey /*根鍵*/, CString path /*位置*/, CString ValueName /*數值名稱*/, DWORD value /*數值型*/)
{
    HKEY newkey;
    if(ERROR_SUCCESS==RegOpenKey(RootKey,path,&newkey))
    {
        //新建數值項
        if(ERROR_SUCCESS==RegSetValueEx(newkey,ValueName,NULL,REG_DWORD,(CONST BYTE*)&value,4))
		{
			RegCloseKey(newkey);
			return true;
		}
		else
		{
			RegCloseKey(newkey);
			return false;
		}
        
    }
    else
    {
        return false;
    }  
}
//獲取字符串
BOOL CMyKey::GetK(HKEY RootKey /*根鍵*/, CString path /*路徑*/, CString strName /*字符串名稱*/, char *pStr /*要保存的字符串對象地址*/)
{
	HKEY newkey;
	if(ERROR_SUCCESS==RegOpenKey(RootKey,path,&newkey))
	{
		DWORD keyType,len;
		if(ERROR_SUCCESS==RegQueryValueEx(newkey,strName,NULL,&keyType,(unsigned char *)pStr,&len))
		{
			RegCloseKey(newkey);
			return true;
		}
		RegCloseKey(newkey);
	}
    //打開失敗
    return false;
}
//獲取數值
BOOL CMyKey::GetK(HKEY RootKey /*根鍵*/, CString path /*路徑*/, CString strName /*數值名稱*/, DWORD &pValue /*要保存的數值變量地址*/)
{
	HKEY newkey;
    if(ERROR_SUCCESS==RegOpenKey(RootKey,path,&newkey))
    {
        //成功打開鍵
		
        DWORD dwType,dwValue,len;
		//關鍵問題出在下一句 竟然使得 OnCreate返回了
		if(ERROR_SUCCESS==RegQueryValueEx(newkey,strName,0,&dwType,(unsigned char *)(LPBYTE)&dwValue,&len))
		{
			pValue=dwValue;
			RegCloseKey(RootKey);
			return true;
		}
		RegCloseKey(RootKey);
    }
	return false;
}
//刪除項
BOOL CMyKey::DelK(HKEY RootKey /*根鍵*/, CString path /*位置*/,CString keyname/*名稱*/)
{
	HKEY newkey;
    if(ERROR_SUCCESS==RegOpenKey(RootKey,path,&newkey))
    {
        if(ERROR_SUCCESS==RegDeleteValue(newkey,keyname))
        {
			RegCloseKey(RootKey);
            return true;
        }
    }
    return false;
}

測試結果:

測試代碼(都是放在按鈕的單擊事件中的):

void CRegister測試View::OnTest()
{
	//MessageBox("show?");

	
	//字符串型 獲取
	char str[MAX_PATH] = { '\0' };
	BOOL result = key1.GetK(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\TypedPaths", "url1", str);
	if (result){
		MessageBox(str);//C:\Users\sophsis\AppData\Roaming\yxj.exe
	}
	else{
		MessageBox("error!");
	}
	

	/*
	//數值型 獲取
	DWORD value = 20;
	CString str;
	if (key1.GetK(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartPage2", "FavoritesVersion", value))
	{
		str.Format("value=%d", value);//value=2
		MessageBox(str);
	}
	else
	{
		MessageBox("error");//失敗則經過這裏
	}
	*/

	//修改字符串型
	//key1.WriteK(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\TypedPaths","url1","test");
	//修改整數型
	//key1.WriteK(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartPage2","FavoritesVersion",3);
	//刪除
	//key1.DelK(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\TypedPaths","url1");
	//key1.DelK(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartPage2","FavoritesVersion");
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章