以下の最小限の例は、レジストリの64ビットビューの変更を32ビットプロセスから検出します。私はあなたのプログラムについて何が違うのか分かりませんが、このコードは32ビットプログラムが実際に両方のビューの変化を検出できることを証明しています。
私はこれがあなたの問題を解決しないことを知っていますが、私はそれが正しい方向にあなたを助けてくれることを願っています。
program RegMonitor;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
procedure Main;
const
dwFilter: DWORD =
REG_NOTIFY_CHANGE_NAME or
REG_NOTIFY_CHANGE_ATTRIBUTES or
REG_NOTIFY_CHANGE_LAST_SET or
REG_NOTIFY_CHANGE_SECURITY;
var
Error: Integer;
key: HKEY;
begin
Error := RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
'Software\Microsoft\Windows\CurrentVersion\RunOnce',
0,
KEY_NOTIFY or KEY_WOW64_64KEY,
key
);
if Error<>ERROR_SUCCESS then
RaiseLastOSError(Error);
try
Error := RegNotifyChangeKeyValue(
key,
True,
dwFilter,
0,
False
);
if Error<>ERROR_SUCCESS then
RaiseLastOSError(Error);
Writeln('Change detected');
Readln;
finally
RegCloseKey(key);
end;
end;
begin
Main;
end.
それで問題がたくさんあるように今、あなたのプログラムのためとして、それが見えます。しかし、基本的な問題は、あなたが変更の通知を受けていないことを意味します、あなたのイベントが正しく作成されていないということです。あなたはこのようにそれを作成します。
CreateEvent(Nil, True, False, 'RegistryChangeMonitorEvent')
ていますが、私は要件は、このイベントのためにあるものを掘り下げていませんでした
CreateEvent(nil, False, True, nil)
、ドキュメントはどんな手がかりを提供していません。このようにそれを作成する必要があります。私がしたのは、MSDN exampleのコードとコードの違いを探すことでした。
イベントの作成を変更して、通知の受信を開始するだけで十分です。しかし、私がその変更を行ったとき、あなたのプログラムはまだ動作せず、AVで失敗しました。あなたのオブジェクトの1つは作成されませんでした。しかし、私はあなたがあなた自身のために並べ替えることができるかなり日常的なバグだと思う。
なぜ私はKEY_ALL_ACCESS
を使用しているのだろうか。 RegNotifyChangeKeyValue
に渡す鍵を開いたときにKEY_NOTIFY
を使用しないでください。そして、キーで何が変更されたかのレポートを作成しようとすると、なぜKEY_READ
を使用しないのですか?今まで書こうとしていないので、KEY_ALL_ACCESS
は適切ではありません。これらの変更を行うと、管理者として実行する必要はありません。
OK、私はここからサンプルアプリケーションをビルドしました:http://msdn.microsoft.com/en-us/library/windows/desktop/ms724892(v=vs.85).aspxそして、私は 'キーを開くときはKEY_WOW64_64KEYとなります。そして、コードはレジストリの64ビット部分の変更を私に通知しました。そうではなく、APIはエミュレータからの 'KEY_WOW64_64KEY'でうまく動作します。 –
さて、あなたのアプリに 'Wow6432Node'をハードコードしました。それは常に悪い考えです。私はこれが純粋にこのアプリをテストするために行われたと信じています。 –
デモ・アプリケーションはテスト目的のためのものです。そのため、私はその中にフラグをハードコードしています。 – smartins