C++を使用した書き込みレジストリ機能の開発
3104 ワード
[align=left 64ビットバージョンWindowsのレジストリは、32ビットレジストリエントリと64ビットレジストリエントリに分けられます.多くの32ビットレジストリエントリは、対応する64ビットレジストリエントリと同じ名前で、逆も同様です.64ビットバージョンWindowsに含まれるデフォルトの64ビットバージョンレジストリエディタ(Regedit.exe)64ビットと32ビットのレジストリ・アイテムが表示されます.WOW 64レジストリリダイレクトは、32ビットプログラムのレジストリエントリに対応する異なるレジストリエントリを提供する.64ビット版レジストリ・エディタでは、32ビットレジストリ・アイテムが次のレジストリ・アイテムの下に表示されます.HKEY_LOCAL_MACHINESoftwareWOW 6432 Nodeデフォルトの64ビットバージョンレジストリエディタを使用して、64ビットと32ビットのレジストリアイテムとアイテム値を表示または編集できます.64ビットレジストリエントリを表示または編集するには、64ビットバージョンのレジストリエディタ(Regedit.exe)を使用する必要があります.また、%systemroot%Syswow 64フォルダの32ビットバージョンレジストリエディタを使用して、32ビットレジストリアイテムとアイテム値を表示または編集することもできます.32ビットバージョンレジストリエディタでタスクを実行する方法は、64ビットバージョンレジストリエディタと変わりません.32ビットバージョンのレジストリエディタを開くには、次の手順に従います.1.[開始](Start)をクリックし、[実行](Run)をクリックします.2.「開く」ボックスに%systemroot%syswow 64regeditと入力し、「OK」をクリックします.注:-mスイッチを使用してレジストリエディタの2番目のインスタンスを起動しない限り、32ビットバージョンのレジストリエディタ(逆も同様)を開くには、64ビットバージョンのレジストリエディタを閉じておく必要があります.たとえば、64ビットバージョンのレジストリエディタがすでに実行されている場合は、手順2で%systemroot%syswow 64regedit-mと入力すると、32ビットバージョンのレジストリエディタが起動します.32ビットと64ビットCOMの登録とプログラム状態の共存をサポートするために、WOW 64は32ビットプログラムに代替レジストリビューを提供する.32ビットプログラムは、本物の64ビットHKEY_と表示されます.LOCAL_MACHINESoftwareツリーが完全に離れた32ビットHKEY_LOCAL_MACHINESoftwareツリー(HKEY_LOCAL_MACHINESoftwareWOW 6432 Node).これでHKEYを隔離できるCLASSES_ROOT、このツリーの各コンピュータ部分は、HKEY_LOCAL_MACHINESoftwareは、COMと他のメカニズムによって64ビット/32ビットプログラムの相互運用性を実現するために、WOW 64は、64ビットレジストリビューと32ビットレジストリビューの間で特定のレジストリアイテムとアイテム値をミラーするために「レジストリリフレクタ」を使用します.この反射器はCOMアクティブ化データのみを反射するため「スマート」である.反射されたレジストリエントリWOW 64レジストリリフレクタは、パス名などを調整するために、反射中にレジストリエントリの内容と値を変更する場合があります.したがって、32ビットのコンテンツと64ビットのコンテンツは異なる場合がある.次のレジストリ・アイテムが反射されます:•HKEY_LOCAL_MACHINE\Software\Classes •HKEY_LOCAL_MACHINE\Software\COM3 •HKEY_LOCAL_MACHINE\Software\Ole •HKEY_LOCAL_MACHINE\Software\EventSystem •HKEY_LOCAL_MACHINE\Software\RPC[/align]
コードの実行後にエラーメッセージは表示されませんでしたが、レジストリでは追加した値が見つからず、長い間憂鬱でした.64ビットシステムのレジストリは32と64に分かれているため、WOW 6432ノードの下で追加された値が見つかったことが分かった.
LPCTSTR lpRun = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
((CButton*)GetDlgItem(IDC_CHECK2))->SetCheck(BST_CHECKED);
WritePrivateProfileString(_T("AutoRun"),_T("Judge"),"1",".\\Config.ini");
// HKEY_LOCAL_MACHINE Software\\Microsoft\\Windows\\CurrentVersion\\Run ;
long lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE,lpRun,0,KEY_WRITE,&hkey);
if(lRet==ERROR_SUCCESS)
{
// Openexe
GetModuleFileName(NULL,exepath.GetBuffer(MAX_PATH),MAX_PATH);
// ReleaseBuffer exepath ( exepath.GetBuffer(MAX_PATH) )
exepath.ReleaseBuffer();
// hkey exepath , (const BYTE*)exepath.GetBuffer(exepath.GetLength()), exepath.GetLength()
lRet=RegSetValueEx(hkey,exepath,0,REG_SZ,(const BYTE*)exepath.GetBuffer(exepath.GetLength()),exepath.GetLength());
// hkey
RegCloseKey(hkey);
// 0
if(lRet!=ERROR_SUCCESS)
{
AfxMessageBox(" , ");
}
}
コードの実行後にエラーメッセージは表示されませんでしたが、レジストリでは追加した値が見つからず、長い間憂鬱でした.64ビットシステムのレジストリは32と64に分かれているため、WOW 6432ノードの下で追加された値が見つかったことが分かった.