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、文字列、バイナリで、それぞれにメンバ関数を割り当てています。 実際に使う例はこちらにあるので、見てください。