[セットトップ]C++読み書きレジストリ


一、説明:レジストリはWindowsの重要な構成部分であり、レジストリにはコンピュータのソフト・ハードウェアに関する情報が大量に記録されている.レジストリの値は、その名前で識別されます.値名はキー名と同じ文字で構成されます.値自体は、文字列、バイナリデータ、または32ビットの符号なし値であってもよい.ここでは主に以下のテクニックを用います:(一)、事前定義されたレジストリキー.レジストリには、いくつかの事前定義キーが含まれています.
  • HKEY_LOCAL_MACHINEには、コンピュータおよびその構成を記述するエントリが含まれます.プロセッサー、マザーボード、メモリ、インストール済みソフトウェア、ハードウェアに関する情報が含まれます. 
  • HKEY_CLASSES_ROOTは、ドキュメントタイプやOLECOMに関する情報のサポートキーです.このキーはHKEY_LOCAL_MACHINEの依存キー. 
  • HKEY_USERSはデフォルトのユーザープリファレンスとして使用され、単一のユーザーのプリファレンスとしても使用されます. 
  • HKEY_CLASSES_USERは、現在(ログイン)しているユーザに関する情報です. 
  • HKEY_CURRENT_CONFIGには、現在のシステム構成の情報が含まれています. 
  • にはもう1つありますが、一般的には現れません.構成されたローカルエリアネットワークの後にしかありません. 

  • (二)、CRegKeyクラス及び主な使用と関数の説明
  • 必要なヘッダファイル:atlbase.h  
  • 共通関数
    ☆         :RegOpenKeyEx
           :LONG RegOpenKeyEx(HKEY hKey,//         ,           
                                   LPCTSTR lpSubKey,//           
                                   DWORD ulOptions,//   ,   0
                                   REGSAM samDesired,//    ,     
                                   PHKEY phkResult//           
                                  );
    
    ☆        :RegQueryValueEx
           :LONG RegQueryValueEx(HKEY hKey,//        
                                      LPCTSTR lpValueName,//         
                                      LPDWORD lpReserved,//   
                                      LPDWORD lpType,//         
                                      LPBYTE lpData,//         
                                      LPDWORD lpcbData//        
                                     );
    
    ☆       RegSetValueEx
           :LONG RegSetValueEx(HKEY hKey,//        
                                    LPCTSTR lpValueName,//         
                                    LPDWORD lpReserved,//   
                                    DWORD dwType,//         
                                    const BYTE *lpData,//      
                                    DWORD cbData//     
                                   );
    
  • 二、例:
  • AppWizardによりダイアログベースのプログラムRegedit
  • を作成する.
  • には、レジストリ内のユーザー名と会社名を照会および変更するための「クエリー」(ID_QUERY)と「修正」(ID_CHANGE)という2つのコマンドボタンが設定されています.注意:情報位置9 xシリーズ:HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrntVersion NTシリーズ:HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrntVersionキー値:RegisteredOwnertkgとRegisteredOrganizationはそれぞれユーザー名と会社名
  • を表します.
  • は、情報を表示および変更するための2つの編集ボックスを設定する.2つのCString変数m_を定義strOwner,m_Company.  
  • 「クエリー」ボタンコードは次のとおりです:
    void CRegeditDlg::OnQuery()
    {
            UpdateData(true);
    	HKEY hKEY;//     hKEY,         
    
    	//      data_Set   hKEY
    	LPCTSTR data_Set="Software\\Microsoft\\Windows NT\\CurrentVersion\\";
    	//     ,hKEY              
    	long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_READ,&hKEY));
    	if(ret0!=ERROR_SUCCESS)//      hKEY,        
    	{
    		AfxMessageBox("  :       hKEY");
    		return;
    	}
    
    	//       
    	LPBYTE owner_Get=new BYTE[80];//       owner_Get
    	DWORD type_1=REG_SZ;//      
    	DWORD cbData_1=80;//      
    
    	long ret1=::RegQueryValueEx(hKEY,"RegisteredOwner",NULL,&type_1,owner_Get,&cbData_1);
    	if(ret1!=ERROR_SUCCESS)
    	{
    		AfxMessageBox("  :            ");
    		return;
    	}
    
    	//     
    	LPBYTE company_Get=new BYTE[80];//       company_Get
    	DWORD type_2=REG_SZ;//      
    	DWORD cbData_2=80;//      
    
    	long ret2=::RegQueryValueEx(hKEY,"RegisteredOrganization",NULL,&type_2,company_Get,&cbData_2);
    	if(ret2!=ERROR_SUCCESS)
    	{
    		AfxMessageBox("  :            ");
    		return;
    	}
    
    	//    
    	m_strOwner=CString(owner_Get);
    	m_strCompany=CString(company_Get);
    	delete[] owner_Get;
    	delete[] company_Get;
    
    	//    ,     hKEY
    	::RegCloseKey(hKEY);
    	UpdateData(false);
    }
  • 「設定」ボタンコードは以下の通りである:
    void CRegeditDlg::OnModify()
    {
    	UpdateData(true);
    
    	HKEY hKEY;//     hKEY,         
    
    	//      data_Set   hKEY
    	LPCTSTR data_Set="Software\\Microsoft\\Windows NT\\CurrentVersion\\";
    	//     ,hKEY              
    	long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_READ,&hKEY));
    	if(ret0!=ERROR_SUCCESS)//      hKEY,        
    	{
    		AfxMessageBox("  :       hKEY");
    		return;
    	}
    
    	//       
            //CString_To_LPBYTE,        
    	LPBYTE owner_Set=CString_To_LPBYTE(m_strOwner);//       owner_Set
    	DWORD type_1=REG_SZ;//      
    	DWORD cbData_1=m_strOwner.GetLength()+1;//      
    
    	long ret1=::RegSetValueEx(hKEY,"RegisteredOwner",NULL,type_1,owner_Set,cbData_1);
    	if(ret1!=ERROR_SUCCESS)
    	{
    		AfxMessageBox("  :            ");
    		return;
    	}
    
    	//     
    	LPBYTE company_Set=CString_To_LPBYTE(m_strCompany);//       company_Set
    	DWORD type_2=REG_SZ;//      
    	DWORD cbData_2=m_strCompany.GetLength()+1;//      
    
    	long ret2=::RegSetValueEx(hKEY,"RegisteredOrganization",NULL,type_2,company_Set,cbData_2);
    	if(ret2!=ERROR_SUCCESS)
    	{
    		AfxMessageBox("  :            ");
    		return;
    	}
    	else
    	{
    		AfxMessageBox("       ");
    	}
    	//    ,     hKEY
    	::RegCloseKey(hKEY);
    	UpdateData(false);
    }
  • 参照関数
    LPBYTE CString_To_LPBYTE(CString str)
    {
    	LPBYTE lpb=new BYTE[str.GetLength()+1];
    	for(int i=0;i<str.GetLength();i++)
    		lpb[i]=str[i];
    	lpb[str.GetLength()]=0;
    	return lpb;
    } 
  • 三、注意:以上のコードはWindows NT/2000/XPでしか通過できません.Windows 9 X/MeではレジストリパスのWindows NTをWindowsに変更してください.本プログラムのソースコードはWindows 2000+VC 6である.0でテストに合格しました.本プログラムのソースサンプルファイルはWindows NT/2000/XPでのみ使用できます.Windows 9 X/Meでは修正して使用してください.