2013-02-05 34 views
6

我有一個程序設置寫入Windows註冊表的絕對必要的應用程序,因此存儲到文件不是一個選項。爲管理權限請求添加清單

爲了簡化這一點,我想給一個「管理員權限」的嘮叨屏幕,而不是試圖解釋如何右鍵點擊程序文件/快捷方式。

我發現了一篇相當不錯的文章,但是在爲清單添加我自己的資源文件後,我收到了重複的資源錯誤。

這應該是由於與內部清單衝突,並解決問題,我看到很多意見建議「啓用運行時主題」在項目選項中被禁用。我已經瀏覽了所有菜單,但找不到它,現在我被告知它可能在Delphi 7中不可用,並在更高版本中引入。

如何添加我自己的清單?

+4

將程序設置寫入註冊表並不是給您的應用程序管理員權限的正確原因!這是一個非常糟糕的主意。 – kobik

+1

人們不知道爲什麼你不做其他開發人員所做的,並將程序設置寫入正確的位置。 –

+0

我正在將它們寫入Hkey當前用戶,從我閱讀的內容來看,它應該可以在沒有管理員的情況下寫入。 – Clinton

回答

22

我已經評論說:「將程序設置寫入註冊表不是給予您應用程序管理權限的正確原因」。不過,在任何情況下都包含UAC清單是一個好主意。常見的requestedExecutionLevel應該是level="asInvoker"see the docs

"Q: Adding manifest for admin rights request for delphi 7" 

創建以下4個文件(2臺):


(UAC只)

uac.manifest

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="MyApp" type="win32"/> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
</assembly> 

uac。RC

1 24 "uac.manifest" 

(UAC + XP主題)

uac_xp.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity type="win32" name="MyApp" version="1.0.0.0" processorArchitecture="x86"/> 
    <dependency> 
    <dependentAssembly> 
     <assemblyIdentity 
     type="win32" 
     name="Microsoft.Windows.Common-Controls" 
     version="6.0.0.0" 
     publicKeyToken="6595b64144ccf1df" 
     language="*" 
     processorArchitecture="*"/> 
    </dependentAssembly> 
    </dependency> 
    <!-- Windows Vista application security requirements. --> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel 
      level="requireAdministrator" 
      uiAccess="false"/> 
     </requestedPrivileges> 
     </security> 
    </trustInfo> 
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
    <application> 
     <!--Windows 7--> 
     <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> 
     <!--Windows Vista--> 
     <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
    </application> 
    </compatibility> 
</assembly> 

uac_xp.rc

1 24 "uac_xp.manifest" 

通過所需rc文件(uac.rcuac_xp.rc)添加到您的項目 「項目>添加到項目」 菜單項。這將在您的項目文件中創建的{$R}指令:

program Project1; 

{.$R 'uac.res' 'uac.rc'} // UAC only 
// OR 
{$R 'uac_xp.res' 'uac_xp.rc'} // UAC + XP Themes 

uses 
    Forms, 
    Unit1 in 'Unit1.pas' {Form1}; 

{$R *.RES} 

begin 
    Application.Initialize; 
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
end. 

注意{$R 'uac_xp.res' 'uac_xp.rc'}。 Delphi會自動編譯rcres文件。

或者,您可以通過Delphi IDE外的brcc32 uac.rc編譯rc文件。然後手動將{$R 'uac_xp.res'}添加到您的項目中。


請確保您不使用任何其他XP清單。

+1

看來你的方法增加資源似乎解決了問題相比,使用IDE添加項目中的資源。我聽到您對管理員的評論,但我現在可以使用設置來查看允許和不允許的內容。 – Clinton

+2

@Redshift,關於你的編輯:請注意'{$ R'uac_xp.res''uac_xp.rc'}'。 Delphi會自動將'rc'編譯爲'res'文件,所以不需要通過'brcc32 uac.rc'編譯'rc'文件。如果你使用'{$ R'uac_xp.res'}',那麼你需要在Delphi IDE之外編譯'rc'文件。 – kobik

+0

僅供參考,在現代Delphi版本中,您可以直接在Project Options中指定自定義.manifest文件的路徑,而不是使用.rc/.res文件。 –

11

如何從Delphi 7項目中刪除「內部」清單?

內部清單是在Delphi由TXPManifest部件,其唯一目的是把XPMan.pas單元添加到其中它已被刪除表格的單元的uses子句表示7次。然後這個XPMan.pas單元將具有清單本身的資源文件包括到項目輸出中。

因此,要消除這種內部清單,你需要從所有的項目的形式(如果使用它們)刪除所有TXPManifest組件,以及所有的XPMan使用從各單位條款引用您的項目。

總之,做以下兩個步驟爲你的項目的所有單位(第一步驟是可選的,如果你沒有使用TXPManifest成分,但第二個):

enter image description here

+0

沒有任何表單上的Xpmanifest compoent或Xpman聲明。 – Clinton

+0

這只是一個(在Delphi 7中常見的方式,我會說)如何嚮應用程序添加清單。因此,如果沒有幫助,請嘗試像以前一樣在整個項目中搜索所有包含的資源'{$ R ResourceFileName.res}'。可以有一個,其中包括清單(資源文件的名稱可以是任何)。 – TLama

0

在Delphi的新版本中,這不再是必需的。
項目選項,然後應用,有一個清單的一部分:

Manifest options
從10.2.1版本東京

此自動維護XP截圖艙單提到作爲Kobik's answer的警告。

我不知道從哪個Delphi版本可用。
(如果您知道,可免費編輯此答案)。