Re: [問題] 發佈程式到其他電腦上

看板C_and_CPP作者 (www.eJob.gov.tw)時間15年前 (2009/07/04 03:16), 編輯推噓3(308)
留言11則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《legnaleurc (CA)》之銘言: : 我的程式是用 VC 2008 編的 : 現在我要把執行檔打包送出 : 可是在 target 上一直無法執行 : 我有在 target 上用 DependencyWalker 看 : 沒有缺 dll : 但是一直出現: : Error: The Side-by-Side configuration information for "檔名" contains errors. : 檔名裡是我自己用 VC 編出的 binary : 我試過很多方法了 : 包括複製 manifest 到目錄裡 : 都沒用 : 裝 redist.exe 有機會解決這個問題 : 可是這個方法需要管理者權限, 不是每台電腦都有裝 : 我也有看過 MSDN 上關於 XCopy 的方法 : 一樣沒用 .... : 我想問到底怎樣發佈才能正常執行 : PS: : 也許有人會建議我改用 MinGW, 不過有些組件 MinGW 無法移植 : 因此不考慮換其他 toolchain 這問題還蠻有趣的,剛試了一下有成功,做了點紀錄。 小記: 1. 預設狀況下,VC的專案設定是會產生 manifest 檔。如果改成不產生此檔執行時 會有問題,現在變成無論如何都要有?? 2. 預設值會將 manifest 內嵌進 exe,所以不需要外接。有內嵌時,外接會被無視。 3. 專案設定改成外接後,manifest 需要跟執行檔同名放一起, 如 1.exe 與 1.exe.manifest。找不到時會有 R6034 這類錯誤。 4. 承上,有錯誤時到事件檢視器去看看,有時會有比錯誤視窗更詳細的說明。 -- 改成 portable 流程: 簡單的例子,用 C 的 Hello World,再 VC 編譯成 /MD,故需要 msvcr90.dll (數值為假設,可能相異)。 專案設定->資訊清單工具->輸入和輸出->內嵌資訊清單=否,故 build 後會輸出 1.exe 與 1.exe.manifest。 打開 1.exe.manifest,刪掉 publicKeyToken 設定,因為 1.exe.manifest 裡面寫 name="Microsoft.VC90.CRT",所以這代表了預設會到 %WinDir%/WinSxS 裡去搜尋 Microsoft.VC90.CRT 對應檔案 在我電腦的是 x86_Microsoft.VC90.CRT_略_9.0.21022.8_x-ww_略.manifest 因為有安裝 VC,所以還有另外一個 Microsoft.VC90.CRT.manifest 在 redist 目錄裡。 將 Microsoft.VC90.CRT.manifest 複製到 1.exe 所在, 同樣刪掉 publicKeyToken 那行設定。 則只要 1.exe + 1.exe.manifest + msvcr90.dll + Microsoft.VC90.CRT.manifest 放在同一個目錄就能執行。 -- (註:可用 Resource Hacker 之類的軟體開 exe 來檢查其有無內嵌 manifest。可用 process monitor 軟體監視 exe 檔被執行後,搜尋 dll 的動作是到哪去。 可用 everything 快速找出電腦上 dll、manifest 相關檔案) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.8.130.199

07/04 03:21, , 1F
07/04 03:21, 1F
補充: 查詢 1.exe 的 manifest 得到某 dll 的 name 如 Microsoft.VC90.CRT 之後 搜尋 %windir%\winsxs\policies 查看是否有無針對此dll的政策設定 由policies規定版本去找 %windir%\winsxs\Manifests 裡有無該dll的 manifest 若能找到,則接著到winsxs裡找政策規定版本的dll。 winsxs沒有找到時,才到1.exe同目錄下找該dll的manifest及dll。 當想要限定 1.exe 使用特定版本的 dll,卻怕目標電腦 policies 規定的 dll 是更新版時,上文「改成 portable 流程」裡的方法可避開winsxs的policies ※ 編輯: zlw 來自: 124.8.130.199 (07/04 05:46)

07/04 17:20, , 2F
感謝,正在測試中
07/04 17:20, 2F

07/06 12:24, , 3F
後來我利用 resource editor 把 public token 去掉
07/06 12:24, 3F

07/06 12:24, , 4F
結果變成 checksum 不合
07/06 12:24, 4F

07/06 12:25, , 5F
QQ
07/06 12:25, 5F

07/06 12:46, , 6F
你是說直接改.exe或.dll,把裡面的metadata改掉後,再執行時
07/06 12:46, 6F

07/06 12:47, , 7F
(打錯,是 manifest,想到 .NET 去了)
07/06 12:47, 7F

07/06 12:49, , 8F
PE header內的checksum錯誤?CFF Explorer軟體裡的Rebuilder功
07/06 12:49, 8F

07/06 12:51, , 9F
能,裡面有Update Checksum,可以試試,這套軟體也可編輯就是
07/06 12:51, 9F

07/06 12:52, , 10F
不過你的程式該不會有用到 *.snk 檔做 RSA 檢驗吧?
07/06 12:52, 10F

07/06 17:51, , 11F
呣,它後來說我缺 comctl32.dll ... 不過我有附啊...
07/06 17:51, 11F
文章代碼(AID): #1AJbZ_rF (C_and_CPP)
文章代碼(AID): #1AJbZ_rF (C_and_CPP)