2008年11月25日 星期二

Inno Setup 包裝 Visual C++ runtime library

前言
用Inno Setup建立Visual C++的安裝程式時,如果你使用MFC Shared DLL的話,通常你都要把vcredist.exe包裝進來,不過vcredist.exe一直存在一個blocking problem,安裝的時候常常會卡在某一個畫面,有時候慢的話要三分鐘才會結束(這個問題在Visual C++ 2008 sp1有獲得改善了),而且vcredist對user來說只需要安裝一次就足夠了,因此在安裝程式的時候,可以透過簡單的語法來判斷是否需要安裝vcredist.exe。


[Setup]
Your program setup

[Files]
; Visual C++ redist
Source: vcredist_x86.exe"; DestDir: "{tmp}"; Check: NeedInstallVC9SP1

[Run]
Filename: "{tmp}\vcredist_x86.exe"; Parameters: /q; WorkingDir: {tmp}; Flags: skipifdoesntexist; StatusMsg: "Installing Microsoft Visual C++ Runtime ..."; Check: NeedInstallVC9SP1

[Code]
var vc9SP1Missing: Boolean;

function NeedInstallVC9SP1(): Boolean;
begin
Result := vc9SP1Missing;
end;

function InitializeSetup(): Boolean;
var version: Cardinal;
begin
if RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9A25302D-30C0-39D9-BD6F-21E6EC160475}', 'Version', version) = false then begin
vc9SP1Missing := true;
end;
result := true;
end;


上面這樣的程式碼會先檢查User端有沒有安裝過vcredist.exe,如果沒有安裝過則解壓縮vcredist並且install,如果已經有安裝了就不解壓縮且不install。

enjoy Inno Setup

16 則留言:

Unknown 提到...

想請問一下
當我的軟體需要包vcredist_x86.exe
會有版權的問題嗎

謝謝 感謝你的回答

高橋旺 提到...

按照他的授權來看,只要你有合法購買Visual Studio,就可以合法的發怖你的程式及vcredist_x86.exe
(依你購買的版本來決定,買VS2005當然就只能發怖VS2005囉)

Unknown 提到...

謝謝你的回答

因為我的軟體需要包進此.exe給客戶下載用
所以想要了解一下

高橋旺 提到...

我目前做的安裝程式也是包裝vcredit_x86.exe在裡面,雖然安裝程式會大了點,不過還可以接受。 :)

Unknown 提到...

你好:
想請問'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9A25302D-30C0-39D9-BD6F-21E6EC160475
這是針對vcredist.exe嗎
哪vcredist_x86.exe的registry是哪個 該怎麼去找
因為我現在就算有安裝 它好像還是偵測不出來
不好意思 對這方面沒什麼經驗
謝謝您的回覆

高橋旺 提到...

SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{9A25302D-30C0-39D9-BD6F-21E6EC160475
這個是針對Visual C++ 2008 sp1 x86 redist的安裝程式喔,如果你不確定其他版本的登錄檔位置,可以安裝後在regedit裡搜尋看看...

Unknown 提到...

不好意思 又來麻煩你
想請問一下
我有辦法直接偵測vcredist_x86.exe
裡的dll是否存在來判斷嗎

因為發現了幾個問題
1). 在Windows 2008裡的registry又不依樣
2). 如果客戶有安裝VC6 它還是會再安裝一遍

不知道您是否對這幾個問題有經驗
感謝您的回覆

高橋旺 提到...

1) 我沒有試過在Windows 2008上執行,如果register會和XP不一樣的話,那判斷register的方法就不對了。 orz

2) 我也沒試過VC6的vcredist_x86,理論上用register的做法,在XP/Vista上都會正常才對。 orz

也是可以判斷dll檔是否存在來決定要不要安裝vcredist,Inno Setup有支援FileExists指令。

windows 2008我改天來試試看好了。 :)

Unknown 提到...

感謝你的回覆

我也來試看看 有什麼心得在與您分享

謝謝

Eden 提到...

剛剛在「http://www.vbforums.com/archive/index.php/t-492368.html」看到另一個方法。

這好像是直接執行讓安裝程式自己判斷裝不裝(微軟的工具好像都有這功能)

Eden 提到...

我後來還是覺得版大的作法比較有用
vc2005的機碼是這個
「SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{A49F249F-0C91-497F-86DF-B2585E8E76B7}」
謝謝版大囉!

高橋旺 提到...

嗯,主要原因還是因為vcredist_x86.exe會不明原因的blocking,我試過Visual Studio 2005, 2008, 2008 sp1都是這樣,有時候安裝順利一下子就結束了,有時候就是會卡在那邊幾分鐘。

:)

Unknown 提到...

不好意思 想請問你 inno setup可以偵測
當程式正在執行, 使用者要移除的話
不讓使用者移除 或是跳出警告訊息的功能嗎
因為對inno setup不熟, 所以冒昧請教你
謝謝你的回答

Weison 提到...

高橋大...想請教如何刪除驅動程式在WINDOWS/inf 底下產生的OEM檔?
作法大概是讀出OEM內容 有關鍵字 刪除該檔案

高橋旺 提到...

To RYAN:

透過Mutex來檢查,主程式執行後建立一個Unique Mutex,然後Installer執行時檢查Mutex是否存在,若存在則提醒User或是自動關閉程式。

高橋旺 提到...

To 威神:

比較直覺的作法就是用Inno的script慢慢寫,我是建議用C寫一個dll檔,再透過Inno呼叫,我認為這樣寫複雜的功能會比較快(ex: 讀文字檔、分析)。

LinkWithin

Related Posts with Thumbnails