關於manifest引起的Crash

2022-07-15 05:27:10 字數 1873 閱讀 3859

專案期間,軟體在開發機器上執行流暢,但一旦到公共機,來不及啟動介面就crash了,於是動用了depends,將缺失的dll等等都加上去,還是crash,於是乎,火了,難道是引用了一些debug版的dll?於是乎,把開發環境也裝上,還是crash,在木有頭緒的時候,注意到depends下面提示到的一些資訊,關於開源庫dll出現error的情況,做了乙個簡單的測試,將出現error的dll拷貝到我機器上,木有報錯,於是問題應該是這些dll呼叫了不同版本的系統dll,導致出錯了。

沿著這條線路,加上群友點撥,終於追到manifest這個東東。關於manifest的介紹,請看下面的文章

除非,你的程式是靜態鏈結的,沒有使用dll,只使用了作業系統核心的

kernel32.dll,

user32.dll,   ole32.dll,   或shdocvw.dll   等  

project的設定必須是use   standard   windows   libraries、not   using   atl、no   common   language   runtime   support    

那麼你可以不需要考慮manifest

可以關掉它  

vs2005中menifest相關的設定:  

project/properties/linker/manifest

file/generate   manifest       決定是否生成manifest,如上情況才可以關閉  

project/properties/linker/manifest

file/allow   isolation                 這個是設定dll的呼叫的,並不能決定manifest是否還是必須的    

project/properties/manifest   tool/input   and   output/embed   manifest     決定manifest是個單獨的檔案還是嵌入到exe內的資源

2。問題:問題的產生是因為從vc6的工程到vs2005的移植,正是因為上述原因而可能出現以下鏈結錯誤:

1>linking...

1>cvtres : fatal error cvt1100: duplicate resource.  type:manifest, name:1,

language:0x0409

1>link : fatal error lnk1123: failure during conversion to coff: file

invalid or corrupt

解決辦法是:開啟rc檔案,找manifest,所屬段或行全去掉

看完這篇文章後,我就納悶了,因為載入的dll是開源專案中的,所以只能給系統打補丁,增加相關的dll和manifest檔案,於是乎,開啟萬能的ultraedit,將乙個dll拖進去,翻了翻,終於出現如下幾行,如獲至寶:

有dependency這樣的關鍵字,再將microsoft.vc80.crt

問題如下:

vc7.1~vc9.0都有這樣的問題,這是微軟搞出來的,名義上說是為了解決dll hell問題,對dll的依賴,不單單是檢測檔名\函式或類入口,還檢測menifest,而我所引用的dll是vs2008編譯的,所以它遵循這個規則。ps,以後還是要自己找開源**來編譯,這個比較靠譜。

在作業系統,有個winsxs目錄,裡面的menifest和profix指定dll的相關版本在**,然後,你的執行程式,有乙個menifest,

你的menifest指定的版本,要在那裡面去找,匹配了,並且指定的目錄有這個dll,才能載入,而我把dll放在執行目錄,沒有manifest這個中介是沒用的,

上面是vc80.crt中版本8.0.50727.4053,publickeytoken是1fc8b3b9a1e18e3b的,在下面的**終於找到了補丁,問題解決,good

x86的控制暫存器CR0,CR1,CR2,CR3

狀態和控制暫存器組除了eflags eip 還有四個32位的控制暫存器,它們是cr0,cr1,cr2和cr3。這幾個暫存器中儲存全域性性和任務無關的機器狀態。cr0中包含了6個預定義標誌,0位是保護允許位pe protedted enable 用於啟動保護模式,如果pe位置1,則保護模式啟動,如果p...

關於spring message標籤引起的問題

最近在做專案,在用spring message標籤做資源國際化的時候,碰到個詭異的問題,著實讓人頭疼一陣。在js 中,嵌入使用spring message標籤做訊息提醒的時候,在中文環境下,一點問題沒有,但一切換到英文環境,出現js錯誤。在chrome瀏覽器中除錯,出現 uncaught synta...

離線快取 manifest 的設定

雖然 manifest 已經從web標準中移除,但是還是來看看manifest的實現吧 這個需要伺服器的支援,也就是需要設定mime,我在本地的wamp 環境下進行設定的,對應的是第四個,也就是下面最後乙個 addtype text cache manifest manifest 伺服器上可以支援之...