2010-05-19 41 views
3

我認爲這個問題已經被問到,但是我找不到適用於我的解決方案。我使用Windows 7旗艦版下的Delphi 7,64位。實際上,我開始在32位操作系統下編寫應用程序,但後來改變了PC,所以現在改爲64.在我的程序中,我使用註冊過程以及從Windows的PROGID值生成的許可證ID。不幸的是,它沒有讀取值,似乎它正在尋找一個不同的文件夾,可能被Windows 64到32位註冊表重定向。你能幫我嗎?這是我使用的代碼:從Windows 7上的Delphi 7讀取注​​冊表時出現問題0123位用戶參與討論

Registry := TRegistry.Create(KEY_READ OR $0100); 
    try 
     Registry.Lazywrite := false; 
     Registry.RootKey := HKEY_LOCAL_MACHINE; 
     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'); 
     result := Registry.ReadString('ProductID'); 
     Registry.CloseKey; 
    finally 
     Registry.Free; 
    end; // try..finally 

另外,你知道如何找到程序是否在Delphi 7中的64位或32位計算機上運行?

+0

你有例外嗎?什麼例外?你的郵箱彈出嗎?鑰匙是否存在?你證實了嗎? – 2010-05-19 08:37:46

+0

它返回空字符串,沒有任何錯誤。 – 2010-05-19 08:51:35

+0

檢查http://stackoverflow.com/questions/2666807/ – 2010-05-19 08:53:21

回答

12

您已經提出這個問題,請參閱Registry ReadString method is not working in Windows 7 in Delphi 7

所以你知道你必須在TRegistry.Create中添加$ 0100。您的代碼的問題是您使用OpenKeyReadOnly將註冊表的Access屬性重置爲KEY_READ,因此KEY_READ or $0100丟失。

只要使用OpenKey而不是OpenKeyReadOnly,這將不會重置您的Access屬性。

+0

是的,我完全忘了:)謝謝,這工作! – 2010-05-19 08:59:18

9

下面是一些Delphi 7中的代碼來檢測你是否在64位操作系統上運行:

function Is64BitOS: Boolean; 
type 
    TIsWow64Process = function(Handle:THandle; var IsWow64 : BOOL) : BOOL; stdcall; 
var 
    hKernel32 : Integer; 
    IsWow64Process : TIsWow64Process; 
    IsWow64 : BOOL; 
begin 
    // we can check if the operating system is 64-bit by checking whether 
    // we are running under Wow64 (we are 32-bit code). We must check if this 
    // function is implemented before we call it, because some older versions 
    // of kernel32.dll (eg. Windows 2000) don't know about it. 
    // see http://msdn.microsoft.com/en-us/library/ms684139%28VS.85%29.aspx 
    Result := False; 
    hKernel32 := LoadLibrary('kernel32.dll'); 
    if (hKernel32 = 0) then RaiseLastOSError; 
    @IsWow64Process := GetProcAddress(hkernel32, 'IsWow64Process'); 
    if Assigned(IsWow64Process) then begin 
    IsWow64 := False; 
    if (IsWow64Process(GetCurrentProcess, IsWow64)) then begin 
     Result := IsWow64; 
    end 
    else RaiseLastOSError; 
    end; 
    FreeLibrary(hKernel32); 
end; 

(無恥地從自己抄襲,here

它看起來像你逝去的KEY_WOW64_64KEY( $ 0100),所以你應該看看64位註冊表分支。如果你想看看32位註冊表分支,你應該通過KEY_WOW64_32KEY($ 0200)。

+0

謝謝,這工作(雖然我只能測試它在64位機器)。你知道如何獲得Windows的產品ID,如果它也是64位的? – 2010-05-19 08:53:57

+0

不太確定..你嘗試過WMI嗎?例如。在這裏:http://stackoverflow.com/questions/502735/pinvoke-call-for-getting-the-windows-serial-number – Blorgbeard 2010-05-19 10:09:39

+0

The_Fox的答案爲我工作,似乎問題是在我打開密鑰的方式。 – 2010-05-20 10:26:30

1

至於你的問題,無論是64位計算機(與64位操作系統不一樣),請看this question的答案。

1

我知道這個主題是關於德爾福7,但我認爲我有問題閱讀註冊表,並來到這裏學習..我結束了使用Key_Read,而不是在這裏建議的所有額外。

我正在使用德爾福2010年,我用Key_Read就好了。

這裏是我的我的源的一部分工作:

//Search registry 

reg:=TRegistry.Create(KEY_READ); 

    with reg do begin 

    try 
     RootKey := HKEY_LOCAL_MACHINE; 
     if OpenKey('\SOFTWARE\Wow6432Node\Blizzard Entertainment\World of Warcraft',false) then 
     begin 
      memo.Lines.Add('HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Blizzard Entertainment\World of Warcraft - exists'); 
      wowdir1 := readstring('InstallPath'); 
      memo.Lines.Add('InstallPath - ' + wowdir1); 
      newline; 
      closekey; 
     end; 
     if OpenKey('\SOFTWARE\Wow6432Node\Blizzard Entertainment\World of Warcraft',false) then 
     begin 
      memo.Lines.Add('HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Blizzard Entertainment\World of Warcraft - exists'); 
      wowdir2 := readstring('GamePath'); 
      memo.Lines.Add('GamePath - ' + wowdir2); 
      newline; 
      wowdir1 := readstring(''); 
      closekey; 
     end; 
     if OpenKey('\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\World of Warcraft',false) then 
     begin 
      memo.Lines.Add'HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\World of Warcraft - exists'); 
      wowdir3 := readstring('InstallLocation'); 
      memo.Lines.Add('InstallLocation - ' + wowdir3); 
      newline; 
      wowdir1 := readstring(''); 
      closekey; 
     end; 
    finally 
    reg.Free; 
    end; 

我想,在這裏顯示的其他鍵,結果發現我不需要KEY_WOW64_64KEY OR KEY_WOW64_32KEY。這一定是Delphi 2010中糾正的一個錯誤。

相關問題