關於在VS環境開發ActiveX控件不能在部分win10或者win8電腦上註冊的解決方案

問題描述:

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版本註冊,且能夠發佈後自動註冊,達到咱們的問題解決目標。所以該方案是該問題處理的最佳方案。

相關文章
相關標籤/搜索