Следующий пример кода раньше возвращал меня идентификатор окон прежде, но теперь он не работает и возвращает пустую строку, не знайте почему.
function GetWindowsID: string;
var
Registry: TRegistry;
str:string;
begin
Registry := TRegistry.Create(KEY_WRITE);
try
Registry.Lazywrite := false;
Registry.RootKey := HKEY_LOCAL_MACHINE;
// Registry.RootKey := HKEY_CURRENT_USER;
if CheckForWinNT = true then
Begin
if not Registry.OpenKeyReadOnly('\Software\Microsoft\Windows NT\CurrentVersion') then showmessagE('cant open');
end
else
Registry.OpenKeyReadOnly('\Software\Microsoft\Windows\CurrentVersion');
str := Registry.ReadString('ProductId');
result:=str;
Registry.CloseKey;
finally
Registry.Free;
end; // try..finally
end;
Кто-либо может помочь?
Это потому, что виртуализированный ключ '\ Software \ Wow6432Node \ Microsoft \ Windows NT \ CurrentVersion \' не содержит элемента 'ProductID'.
Измените свой код, чтобы создать экземпляр TRegistry с
Registry := TRegistry.Create(KEY_WRITE OR KEY_WOW64_64KEY);
, где KEY_WOW64_64KEY = $ 0100. Это даст вам ожидаемый результат.
В качестве альтернативы используйте DSiWin32 и вызовите
DSiReadRegistry('\Software\Microsoft\Windows NT\CurrentVersion',
'ProductID', '', HKEY_LOCAL_MACHINE, KEY_QUERY_VALUE OR KEY_WOW64_64KEY);
Я бы сказал, что это вызвано UAC - попробуйте запустить как администратор!
Если он работает при запуске от имени администратора, то вам нужно изменить запрос на чтение, чтобы использовать режим только для чтения (не на рабочем месте в МО, поэтому не могу точно вспомнить, как вы это делаете)
редактировать:
function GetWindowsID: string;
var
Registry: TRegistry;
str:string;
begin
Registry := TRegistry.Create(KEY_READ);
try
Registry.RootKey := HKEY_LOCAL_MACHINE;
// Registry.RootKey := HKEY_CURRENT_USER;
if CheckForWinNT = true then
Begin
if not Registry.OpenKeyReadOnly('\Software\Microsoft\Windows NT\CurrentVersion') then showmessage('cant open');
end else
Registry.OpenKeyReadOnly('\Software\Microsoft\Windows\CurrentVersion');
str := Registry.ReadString('ProductId');
result:=str;
Registry.CloseKey;
finally
Registry.Free;
end; // try..finally
end;
Попробуйте прочитать его вручную с помощью RegEdit. Вы можете получить сообщение «Доступ запрещен» из-за проблемы с разрешением, и в этом случае посмотрите на свой уровень и то, как вы получаете к нему доступ.