VS2008上利用ATL(動態模板庫)編寫的項目ActiveX控件在部分電腦上可成功註冊並運行,但部分電腦上沒法註冊特別是Win10環境上。redis
在Win七、Win八、Win10等環境下成功註冊ActiveX控件。windows
經過對問題的分析,能夠發現部分電腦是能夠註冊的,爲何部分不能夠?經過了解後發現能註冊的電腦是安裝過VS或者安裝某些軟件時候自動安裝了VS運行環境,那麼問題可能就是這個。而後針對這個問題進行了三種方案的研究,兩種方案驗證可行,那麼總結出問題就是運行環境問題致使不能註冊,下邊分別說明和比較:工具
既然項目依賴運行庫,那麼其它插件爲何不須要運行庫,所以首先針對項目進行了研究。發現項目編譯生成dll文件時,採用的是動態連接運行庫文件,所以修改編譯屬性爲靜態連接後從新編譯運行項目,註冊成功。開發工具
屬性修改方法:項目屬性-》配置屬性修改「C/C++/Code Generation」 -》運行時庫,將/MD或/MDd 改成 /MT或/MTd,這樣就實現了對VC運行時庫的靜態連接,在運行時就再也不須要VC的dll了。spa
/MD和/MDd:動態連接庫文件,/MD爲release版本,/MDd爲debug版本。操作系統
/MT和/MTd:靜態連接庫文件,/MT爲release版本,/MTd爲debug版本。插件
結論:debug
通過和項目負責人確認以後,生產項目必須依賴其它的運行庫環境,所以採用靜態連接直接致使項目編譯經過不了。所以此方案針對獨立的ATL項目有效,須要連接庫文件項目不可用。日誌
因爲不能採用靜態編譯解決問題,所以採用物理方式,直接安裝VS運行庫,而後項目註冊成功。開發
結論:
通過和項目負責人確認以後,改項目須要自動下載和註冊,所以若是採用安裝運行庫的方式雖然能夠實現全部電腦正常註冊,可是不能自動執行,須要用戶手動安裝VS運行環境,比較繁瑣。可是在沒有可選方案前提下,也只能採用此方案。
既然安裝VS運行庫能夠註冊成功,那麼項目運行須要用到哪些庫文件呢?直接將VS環境的運行庫拷貝到項目下是否能夠正常運行?經過對項目文件反編譯進行分析以後,發現該項目依賴VS環境中的幾個運行庫位置以下:
D:\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedistx86\Microsoft.VC90.DebugCRT 下的下列文件:
Msvcm90d.dll
Msvcp90d.dll
Msvcr90d.dll
Microsoft.VC90.DebugCRT.manifest
將這四個文件拷貝到運行程序同一文件夾下,而後運行項目,註冊成功。
可是在新裝操做系統中註冊出現了問題,通過控制檯提示使用skstrace.exe工具進行了日誌分析,提示缺乏ATL90.dll運行庫,通常程序都本身封裝了ATL90.dll運行庫,所以下載了以後發現同樣出現問題。分析以後原來是版本不對,須要採用反編譯以後文件中依賴的版本。
將正確的版本拿過來後仍是不行,通過分析是由於系統到c:\windows\winsxs掃描manifest文件找不到該運行庫,因此咱們須要將開發工具manifest文件放到項目下,系統盤找不到時會掃描全盤的manifest文件,而後找到該運行庫。須要運行庫:
D:\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.ATL下的下列文件:
ATL90.dll
Microsoft.VC90.ATL.manifest
結論:
因爲該方案最接近原始項目,自動依賴拷貝的運行庫文件,不須要手動安裝運行環境,而且能夠實現各個windows版本註冊,且能夠發佈後自動註冊,達到咱們的問題解決目標。所以該方案是該問題處理的最佳方案。