Tips of VC++ > レジストリ > クラスを使って簡単にアクセスする
★ 前へ戻る ★ 次へ進む ★


クラスを使って簡単にアクセスする

レジストリはINIファイルに代わって使われるようになったもので、 アプリケーション固有の情報を保存できるようになっています。 基本的にファイルアクセスと同じようなものです。 キーを開いたり閉じたりする処理が必要なので、 クラスを使ってカプセル化すると簡単です。

レジストリの構造はフォルダの階層構造になっています。 基本的に"HKEY_LOCAL_MACHINE\Software\会社名(HN等)\アプリケーション名" という感じになっています。 Softwareというフォルダまでは既にあるので、 ハンドル名とアプリケーション名のフォルダを作ってしまいます。 コンストラクタにこれらの処理をさせて、 メンバ関数で値を保存する関数と読み取る関数を追加します。 必要に応じてキーを削除する関数を作ったりしてください。 デストラクタで開いたフォルダたちを閉じます。
こんな感じです。

/*
 *  --------------
 *    registry.h
 *  --------------
 */


#ifndef __REGISTRY_H__
#define __REGISTRY_H__


class CRegistry
{
private:
    LPTSTR m_AppName;

    HKEY m_hSoftware;
    HKEY m_hCompany;
    HKEY m_hApplication;

public:
    CRegistry(LPCTSTR);
    ~CRegistry();

    long SetDWORDValue (LPCTSTR,DWORD);
    long SetStringValue(LPCTSTR,LPCTSTR);
    long SetBinaryValue(LPCTSTR,LPBYTE,DWORD);

    long LoadDWORDValue (LPCTSTR,DWORD &);
    long LoadStringValue(LPCTSTR,LPCTSTR,DWORD);
    long LoadBinaryValue(LPCTSTR,LPBYTE,DWORD);

};


#endif /* __REGISTRY_H__ */


/* * --------------- * replace.cpp * --------------- */ #include "stdafx.h" #include "registry.h" CRegistry::CRegistry(LPCTSTR in_AppName) :m_AppName(NULL),m_hSoftware(NULL), m_hCompany(NULL),m_hApplication(NULL) { m_AppName=new char[::strlen(in_AppName)+1]; ::strcpy(m_AppName,in_AppName); ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software", 0,KEY_READ|KEY_WRITE,&m_hSoftware); ::RegCreateKeyEx(m_hSoftware,"Company Name", 0,NULL,REG_OPTION_NON_VOLATILE, KEY_READ|KEY_WRITE,NULL,&m_hCompany,NULL); ::RegCreateKeyEx(m_hCompany,in_AppName, 0,NULL,REG_OPTION_NON_VOLATILE, KEY_READ|KEY_WRITE,NULL,&m_hApplication,NULL); } CRegistry::~CRegistry() { delete m_AppName; ::RegCloseKey(m_hApplication); ::RegCloseKey(m_hCompany); ::RegCloseKey(m_hSoftware); } long CRegistry::SetDWORDValue(LPCTSTR in_KeyName, DWORD in_Value) { return ::RegSetValueEx(m_hApplication,in_KeyName, 0,REG_DWORD,(LPBYTE)&in_Value,sizeof(DWORD)); } long CRegistry::SetStringValue(LPCTSTR in_KeyName, LPCTSTR in_Value) { return ::RegSetValueEx(m_hApplication,in_KeyName, 0,REG_SZ,(LPBYTE)in_Value,::strlen(in_Value)+1); } long CRegistry::SetBinaryValue(LPCTSTR in_KeyName, LPBYTE in_ValueBuffer, DWORD in_BufSize) { return ::RegSetValueEx(m_hApplication,in_KeyName, 0,REG_BINARY,(LPBYTE)in_ValueBuffer,in_BufSize); } long CRegistry::LoadDWORDValue(LPCTSTR in_KeyName, DWORD &in_Value) { DWORD size=sizeof(DWORD); return ::RegQueryValueEx(m_hApplication,in_KeyName, 0,NULL,(LPBYTE)&in_Value,&size); } long CRegistry::LoadStringValue(LPCTSTR in_KeyName, LPCTSTR in_Buffer, DWORD in_BufSize) { return ::RegQueryValueEx(m_hApplication,in_KeyName, 0,NULL,(LPBYTE)in_Buffer,&in_BufSize); } long CRegistry::LoadBinaryValue(LPCTSTR in_KeyName, LPBYTE in_Buffer, DWORD in_BufSize) { return ::RegQueryValueEx(m_hApplication,in_KeyName, 0,NULL,in_Buffer,&in_BufSize); }

レジストリには3種類の値を格納できます。 その3種類はDWORD、文字列、バイナリで、それぞれにメンバ関数を割り当てています。 実際に使う例はこちらにあるので、見てください。