小華的部落格: 2014/12/14 - 2014/12/21

bloggerads_Head

搜尋此網誌

星期五, 12月 19, 2014

VC++ 可轉散發套件(Redistributable Package)


這篇文章只是要告訴大家可轉散發套件(VC++ Redistributable Package是幹甚麼的?

1)首先呢,我先在我的Win7 64 bit OS底下安裝VS2008 ,安裝時順便選擇我要裝x64 compiler,這樣子我的開發環境就會有VS2008 32 bit/64 bit compiler 功能!

2) 接著,我建立一個新的VC++空專案(VC++-->General-->Empty Project),裡面加入我自己的C 語言Source code (Tmake.c 跟Tmake.h),然後再專案屬性的地方先設定Win32 (Right click Project -->Properties ,在Platform 的地方選"Win32")

3) 先產生一次32 bit的應用程式,他會產生再輸出目錄 『Debug\Tmake.exe』

4) 接著,修改專案屬性,改選擇x64 ((Right click Project -->Properties ,在Platform 的地方選"x64"),如果你沒看到x64可以選擇,就是在安裝VisualStudio時沒選擇x64 compiler選項

5) 然後再產生一次 64 bit的應用程式,他會產生在輸出目錄『x64\Debug\Tmake.exe』

完成了步驟5之後,我就會有兩個執行檔,分別是32 bit版本跟64 bit版本。

底下是我的開發環境 (產生執行檔,但是拿到別台去執行)

OS: Windows 7 64 bit
Visual Studio 2008

底下是我的執行環境 (這台機器上面執行我自己寫的程式)

OS : Windows 8.1 64 bit
Visual Studio 2012/2013



    [圖1]  32 bit/64 bit 的主要差別除了暫存器之外就是在於 Calling Convention (呼叫慣例)

所以大家可以看到,我在Win7開發拿到另一台Win8.1 上面執行,而在Win8.1中我只安裝了Visual Studio 2012/2013這兩個版本,但是我的Win7開發時是Visual Studio 2008開發的。

所以,當我在Win8.1底下不管是執行32 bit 版本的Tmake.exe 或是  64 bit 版本的Tmake.exe 我都得到了相同的錯誤訊息。

ERROR MESSAGE:  因為應用程式檔設定不正確,所以無法啟動


[圖 2] 無論32/64 bit 都得到相同的錯誤訊息


假如你看到類似這種錯誤訊息時,只要去安裝可轉發套件,把需要的檔案補足在你的電腦中理論上問題就會消失了,但是 "你要找的到正確的版本的可轉發套件" (後面會講找不到時的解決方式)。


底下版本是VS2008 version v9.0.30729

底下版本是VS2008 v9.0.30729.6161 (比上面的還新一點)

Microsoft Visual C++ 2008 Service Pack 1 Redistributable Package MFC Security Update


另外,你可以在安裝完畢後,從System Event Log看到你到底安裝了甚麼版本:

Windows Installer 已安裝該產品。產品名稱: Microsoft Visual C++ 2008 Redistributable - x64 9.0.30729.6161。產品版本: 9.0.30729.6161。產品語言: 1033。製造商: Microsoft Corporation。安裝成功或錯誤狀態: 0

如果,你安裝完畢後還不能執行的話,那就是版本不同!  


如果你從System Event Log 查看,也會看到類似下面的錯誤訊息:

"D:\TmakeJpg\Debug\Tmake.exe" 的啟用內容產生失敗。 找不到依存組合 Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"。

意思是說你執行Tmake.exe的電腦內的所能提供的執行環境跟這個應用程式內所要求的版本不同; 從上面的範例可以知道我安裝的都是v9.0.30729.xxxx 但是這個應用程式需要的是9.0.21022.8,這個時候,你有幾個解決方式。

方式1: 從開發的機器上把需要的檔案複製到執行的機器上的Windows\System32 底下
需要的檔案需要配合你的應用程式的類型來複製對應的檔案,例如:

Release Build 64 bit(x64):  
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Amd64\Microsoft.VC90.CRT 
Release Build 32 bit(Win32):  
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT 

msvcm90.dll
msvcp90.dll
msvcr90.dll
Microsoft.VC90.CRT.manifest

Debug Build 64 bit(x64):
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\amd64\Microsoft.VC90.DebugCRT

Debug Build 32 bit(Win32):
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugCRT

msvcm90d.dll
msvcp90d.dll
msvcr90d.dll
Microsoft.VC90.DebugCRT.manifest

方式2 : 把前面這些需要的檔案打包變成xxx.exe 再一起拿去執行的電腦安裝與執行.

請參考: http://msdn.microsoft.com/en-us/library/ms235291(v=vs.80).aspx
              http://msdn.microsoft.com/en-us/library/aa260978%28VS.60%29.aspx

方式3: 在專案屬性中選擇使用靜態MFC Library. (Win32/X64都要設定一次) 再重新編譯執行檔就可以了。



結論 :

 VC++的轉散發套件就是給『跟你開發環境不同』的人去補足需要的Library/DLL之後,才能順利執行你所開發的應用程式。

所以,程式開發者可以選擇『自己打包好所需要的檔案』後再提供給使用者免去使用者無法執行的窘境,或是使用者自己無法執行應用程式時去安裝對應的『轉散發套件』。

[註] 我的測試程式後來採用方式3解決問題! 系統就算不安裝VC++的轉散發套件也沒問題。