2010-02-04 48 views
4

我正在將InstallShield項目轉換爲基於WiX的安裝程序。我有一些VB6項目的二進制文件需要註冊。使用WiX安裝VB6二進制文件

InstallShield項目實際上將這些標記爲自注冊文件。從我看過的文章來看,這似乎是Windows Installer世界中的「壞事」。

我的問題是,我該怎麼做呢?一個VB6項目可能會在每次重新編譯後更改其內部GUID - 是的,我已經在使用二進制兼容性。

我用Heat來生成所有Registry和Class條目,但其中一些條目從構建變爲構建。我已經讀過,熱火的設計並不是用於每一個版本,而是作爲一個起點。

其他人在做什麼來處理VB6和WiX註冊?

回答

0

我們一直在玩的一件事是通過使用registration-free COM來完全消除全局COM註冊。 (我們之後的主要優勢是能夠在完全隔離中並排部署不同版本的相同應用程序。)

但是,使用免註冊COM時,您仍然必須編寫或生成需要的清單文件由設置部署。鏈接問題的答案表明有一些工具可以幫助解決這個問題。與此同時,我們還將舊的VB6和Delphi庫與heat.exe一起使用自注冊和自動wxs生成組合。雖然你是對的,熱量最初並沒有被設計成這樣使用,但現在已經有moving in that direction

在任何情況下,如果您想支持次要升級或在應用程序之間共享組件,標識符的穩定再生(在heat.exe的初始設計中缺少這一點)非常重要。我們只是在升級過程中完全卸載以前版本的產品(也就是major upgrade),所以我們不需要擔心這種情況。

2

我們在VB6中開發了兩種類型的組件。我們在項目中引用的潛在通用組件,以及我們每天構建的易變的應用程序組件。常用組件被打包爲合併模塊(使用WiX),而應用程序組件映射到應用程序設置的組件。這是我們的主要.wxs的片段文件

<Component Id="MyFile15.ocx" Guid="YOURGUID-BCB7-451C-B07D-D205AEAE1EB9" > 
    <File Id="MyFile15.ocx" Name="MyFile15.ocx" LongName="MyFile15.ocx" KeyPath="yes" src="$(var.SrcAppBinnPath)\MyFile15.ocx" DiskId="1" /> 
    <?include Registry_MyFile15.wxi ?> 
</Component> 

我們仍在使用WiX的2.0,所以我們使用的是tweaked version of tallow生產.wxi文件所有的ActiveX DLL文件/ OCX控件/ EXE文件我們正在建設的註冊表日常。我們將所有COM註冊作爲直接註冊表表項輸入,而不是com/typelib條目。我們針對傳統Windows Installer 2.0,因爲我們不需要任何新功能。

我們對一些特殊情況使用自定義操作(VC6 DLL) - MSDE設置,數據庫修補,DCOM下載/設置。我們正在使用平臺SDK引導程序,它可以下載instmsiX.exe並在原始系統(主要是9x和NTs)上準備Windows Installer。我們使用7-zip自解壓器在客戶端機器上解壓bootstrapper和msi。在某些情況下,我們在可執行文件上使用UPX --lzma,但在終端服務器上這些擴展不能很好地擴展,其中未打包的版本在會話中重複使用。

最近我們一直在使用免註冊COM將我們的客戶遷移到可移植構建。我們正在使用我們的內部UMMM tool來生成免註冊的COM清單。 SxS COM有侷限性(沒有DCOM,沒有ActiveX EXE),但允許我們在應用程序運行時更改構建 - 不會重新安裝停機時間。

0

我走了一條不同的路線,並使用我在IDL中創建的接口定義了所有對象,並將其編譯爲類型庫(.tlb)。稍微長一點的方法,但它意味着所有的GUID保持不變。

我能夠實現接口的版本並在同一個文件中處理多個版本的dll。

缺點是,這不會對OCX控件有所幫助,並且您無法使用tlb邊界上的事件。這對我來說不是問題,因爲我通常使用DLL的回調函數給它們的調用者,因爲它們可以更高效。

本產品在DVD上部署到全球各地的客戶,目前使用InstallShield安裝程序,但我正在研究移動到WiX。