從vs2005開始,微軟在vc的編譯選項中新增了
manifest這個功能,這將有助於軟體以
side-by-side方式執行。
採用/md和/mdd執行時庫選項的專案manifest是必要的。當程式啟動時發生類似下圖找不到msvcr***.dll時可能就是程式沒有正確的嵌入清單檔案。
怎樣給程式嵌入manifest清單?
開啟預設的manifest鏈結功能需要修改兩處配置:專案屬性→配置屬性→鏈結器→清單檔案→生成清單,設定為「是」;專案屬性→配置屬性→清單工具→輸入和輸出→嵌入清單,設定為「是」。生成解決方案即可。
若要關閉清單嵌入功能則可將上述選項改為「否」。
以管理員啟動程式
找不到msvcr *** .dll ?
確認應用程式正確的嵌入或配置了manifest清單檔案。
關鍵的 error 14001 ?
用vs自帶的錯誤查詢工具得到的解釋為:「由於應用程式配置不正確,應用程式未能啟動。重新安裝應用程式可能會糾正這個問題」。該錯誤在p/invoke下表現為exception from hresult: 0x800736b1 。
通常該錯誤意味著應用程式的依賴dll庫找不到或者依賴庫的依賴庫找不到。用dependency walker可以方便的檢視應用程式依賴的dll是否存在。補上找不到的dll一般就沒啥問題了。一些公用的dll可以從獲取。
如果發現dependency walker的日誌視窗出現類似下面的報錯,需特別注意:
此時應該確認所以被依賴的dll(包括被間接依賴的dll)中內嵌的manifest所依賴的執行時庫都是可用的。如果這些dll所依賴的執行時庫是不同的,則應該安裝這些依賴的執行時庫或將對應的dll拷貝到應用程式所在目錄。
可以在vs直接開啟exe或者dll檔案來匯出檢視manifest的內容。
一些擔當庫角色的dll可能是由第三方在很早以前就生成好的,應用程式發布時相應的執行時庫可能已經很難獲得,要針對每個dll都找到其對應的執行時庫版本就更難了。將所有這些不同版本的執行時庫都蒐集齊並安裝給終端使用者也實在是一種羞辱,微軟早已保證了新版本的執行時庫向前相容。
那,怎麼做?怎麼做才能讓這些早期發布的dll自動繫結到新版本的執行時庫?
將manifest過早的嵌入到dll中本身就是一種錯誤,這種硬繫結直接限制了dll自動公升級到新的執行時庫,並會導致其他一系列問題。比如,程式將無法從乙個模組中申請記憶體然後在另外乙個模組中釋放,即使採用的是/md選項,也因不同版本的執行時庫記憶體管理不在乙個堆上,棘手的跨模組的記憶體管理問題撲面而來。倒!
最好的做法是:僅在乙個地方(可執行檔案)嵌入manifest來指明執行時庫,不要在任何dll中採用manifest。
當然也可以選擇非嵌入的manifest,這樣後期公升級只要手動更改xml檔案即可。
啟動管理員程序
當我們執行乙個程式的時候有時需要提公升到管理員許可權,但是預設的c 程式的執行許可權是當前使用者的許可權,那麼怎麼提公升這個啟動許可權呢?經過網上的一番搜尋後,找到如下兩種方式 第一種辦法 在專案的 properties 上新增 新建項 彈出視窗找到 應用程式清單檔案 最後 確定 第二種辦法 asi...
electron應用以管理員許可權啟動
最近在用electron開發pc桌面應用,其中有個需求就是整個應用以管理員許可權啟動。很頭痛,各種google,baidu。最後終於解決了,可以分為三個步驟,做個總結分享。一 如果沒有manifest.xml檔案的話 可通過執行命令 mt.exe inputresource 某某.exe out e...
VS2010 以管理員許可權啟動
在某些專案進行開發的時候,需要提公升應用程式本身的許可權,這個是很容易的。但是如何讓vs2010啟動的時候就已管理員許可權執行程式呢?為這個問題苦惱了好久,終於找到了辦法。找到vs2010的快捷方式 右擊 開啟檔案位置 找到vs2010的啟動專案devenv.exe 右擊 屬性 相容性 特權等級,以...