2010-06-06 23 views
3

到目前爲止,如果我不得不將文件擴展名與我的應用程序相關聯,那麼我只是簡單地修改註冊表。但是我多年來一直沒有這樣做,恐怕事情可能會發生一些變化。我不知道如何防止Windows 7/Vista中的註冊表訪問限制(如果有任何HKEY_CLASSES_ROOT)。因此,我正在尋找一些德爾福圖書館,單位,代碼片斷或任何可以在XP,Vista和7下可靠工作的東西。 是否有任何處理「備份」的東西?通過備份我的意思是恢復到以前的協會的變化的可能性...將特定的文件擴展名與我的delphi應用程序相關聯 - 任何用於此的庫?

+0

直接使用註冊表是管理shell文件擴展名的標準方式。而且這也不是特別困難... – 2010-06-06 12:22:29

+0

我知道這並不難,我只是怕在Vista和7中引入新的特權系統。 – migajek 2010-06-06 12:26:12

+0

不怕。但前提是你不在部署的應用程序中執行此操作。編輯文件關聯 - 是應該安裝應用程序的東西。安裝程序以admin /擡頭運行,所以它對HKLM的訪問沒有任何問題。它可以安裝應用程序並註冊它。你的應用程序本身不應該註冊文件assoc。那麼,如果你願意,你可以做到。但爲此使用HKCU。 – Alex 2010-06-06 16:50:15

回答

5

我會建議不要使用第三方組件,因爲它只會使事情變得更加複雜。

我們都知道如何通過編輯HKEY_CURRENT_USERHKEY_LOCAL_MACHINE配置文件進行文件關聯,對吧?在Windows Vista +中,編輯前者意味着沒有問題,但如果由於某種原因想要編輯後者,即如果要編輯計算機上所有用戶的關聯,則應用程序需要以提升的權限運行。

要使應用程序以提升的權限運行,用戶可以右鍵單擊該圖標並選擇「以管理員身份運行」。但這很醜陋。但是,可以通過簡單地將清單(XML文件)添加到應用程序的資源來自動以管理員身份運行應用程序。然後,無論最終用戶如何啓動程序,UAC提示都將在執行* .exe文件時自動彈出,程序將以管理員身份運行,並且完全可以更改配置單元。有關如何添加此清單的詳細信息已在幾個SO問題中進行了解釋。這真的很容易。

據我所知,正在運行的應用程序不可能在運行時「升級」它的權限。所以,如果你在你的應用程序的按鈕,與正常權限運行的,你不能做這樣的事情:

procedure Button1.Click(Sender: TObject); 
begin 
    SomehowGetAdminPrivileges; 
    ChangeLocalMachineRegistry; 
    SomehowGetBackNormalPrivileges; 
end; 

這是完全不可能的。所以,如果你需要做一些事情,在運行時需要管理員權限,你需要調用外部應用程序,如

procedure Button1.Click(Sender: TObject); 
begin 
    ShellExecute(Application.Handle, nil, PChar('myapp.exe'), nil, nil, SW_SHOWNORMAL); 
end; 

MyApp.exe將需要有一個清單,這樣它會與引發權限運行,和能夠做你想做的。但最好myapp.exe不應該有一個GUI - 當用戶單擊該按鈕時,出現UAC提示,並且myapp.exe執行註冊表更改,然後終止。

這將是可能的,但使用第三方組件完成此操作很尷尬。

您是否需要在安裝過程中更改註冊表?如果您使用Inno Setup,專業和免費工具,Inno Setup將包含您的清單。因此,如果設置需要,例如啓動setup.exe(用Inno Setup編譯),UAC提示將出現。如果安裝程序將對HKEY_LOCAL_MACHINE進行任何更改。

+0

你知道'HKEY_CLASSES_ROOT'是'HKEY_CURRENT_USER'和'HKEY_LOCAL_MACHINE'中子鍵的組合,對吧?請參閱http://en.wikipedia.org/wiki/HKEY_CLASSES_ROOT#HKEY_CLASSES_ROOT_.28HKCR.29 – 2010-06-06 12:55:07

相關問題