2014-07-06 70 views
0

我希望我的程序在啓動時簡單地請求提升權限,並執行此操作我將一個Manifest文件作爲資源添加到Delphi源代碼中。這是XML文件內容:修改存儲爲資源的UAC清單文件Delphi

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity version="1.1.1.1" 
     processorArchitecture="X86" 
     name="YourApplicationExeName" 
     type="win32"/> 
    <description>elevate execution level</description> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
     <security> 
     <requestedPrivileges> 
      <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> 
     </requestedPrivileges> 
     </security> 
    </trustInfo> 
    </assembly> 

我需要修改的地方說:「YourApplicationExeName」的文件,並添加當前的.exe名稱作爲用戶可以重命名.exe文件隨時隨地。

我想知道的是:當用戶打開可執行文件時,如何將可執行文件的新文件名添加到作爲資源存儲的清單文件中?我知道如何獲取新文件名,我只想知道如何使用新文件名更新資源文件?

+0

不前一個副本。我的問題是如何修改XML文件 - 添加當前應用程序名稱 - 並將其添加爲資源文件以再次使用? – ddvniek

+0

您可以像修改任何文件一樣修改文件。這是編程的基本先決條件,您知道如何編輯文本文件。如果您不知道如何編輯文本文件,則需要返回到開頭。如果你想知道如何從你現在的位置到你想要的位置,那麼你需要詳細解釋你目前的工作,即你現在的位置。我們無法讀懂你的想法。請編輯這個問題,並花更多的精力來解釋。 –

+0

您所要做的就是從任何有關如何編譯和添加清單資源的教程開始。他們都是一樣的。你可以在這個問題上找到可用的。 1.製作XML文件。 2.製作.rc文件。 3.將.rc文件編譯爲.res文件。 4.鏈接.res文件。如果您希望使用高級'$ R'選項,步驟3/4可以合併爲一個。我們在這裏根本不需要另一個「如何編譯和鏈接資源」問題。已經有成千上萬的了。 –

回答

1

你所要求的是不可能的。進程從可執行文件開始。該文件在執行過程中被鎖定,無法修改。

如果您希望修改已編譯的可執行文件中的資源,那麼您可以使用UpdateResource API。但該文件不能被鎖定才能這樣做。你需要從另一個過程來做到這一點。

我認爲你無論如何都在過度分析。您希望修改的字段不應包含可執行文件的文件名。畢竟,文件名可以改變。該字段具有應用程序的名稱,該值與可執行文件的文件名無關。

documentation描述此字段是這樣的:

獨特的名稱應用程序或組件。對名稱使用以下格式:Organization.Division.Name。例如Microsoft.Windows.mysampleApp。

總之,我想你已經被寫過YourApplicationExeName的人誤導了。在程序編譯完成後,你不應該試圖修改這個資源。編譯應用程序時,應該正確設置字段,就是這樣。

+0

謝謝你的回答。換句話說,如果我想更新可執行文件的資源,另一個可執行文件將不得不這樣做,因爲第一個可執行文件無法運行。 此外,「YourApplicationExeName」字段不需要可​​執行文件的文件名,而是應用程序的名稱? – ddvniek

+0

兩個計數都正確。你絕對不想像這樣修改可執行文件。我從未遇到過這樣的計劃。 –

0

讓Delphi不要在程序中包含程序集清單,而是要有一個外部清單。

例如:

Contoso.exe 
Contoso.exe.manifest 

甲文件只是一個XML文件。當用戶重命名Contoso.exeFrobber.exe,您可以:

  • 告訴他們一個Frobber.exe.manifest文件還重命名Contoso.exe.manifestFrobber.exe.manifest
  • 嘔出來到他們的硬盤驅動器在啓動Frobber.exe