有個(gè)VB做的WebService客戶端程序,一直是需要安裝SOAP Toolkit 3.0后才能使用,所以客戶需要安裝兩個(gè)安裝包,一個(gè)是我這個(gè)程序,一個(gè)是SOAP Toolkit 3.0。
昨天終于下決心抽空研究怎么合并打包程序了,經(jīng)歷是曲折的:
1. 從微軟官方下載到了soapsdk的再分發(fā)包:STK3Redist.EXE
2. 解壓后發(fā)現(xiàn)里面是幾個(gè). msm文件(isapi3_files.msm,soap3_core.msm,winhttp51.msm)
3. 上網(wǎng)搜索 .msm文件的使用方法,結(jié)果有人說(shuō)用installshield可以打開,打開后,看到里面有mssoap30.dll等文件, 可是打開后無(wú)法導(dǎo)出,只能合并到別的msm文件或msi文件中,試著合并到自己程序的msi文件中,提示出錯(cuò),合并失敗,并無(wú)錯(cuò)誤描述。
4. 于是開始研究提取msm文件中的文件,將msm文件導(dǎo)出到一個(gè)空的msi文件中,然后試了兩個(gè)提取msi文件的軟件(Universal Extractor和MSI文件提取器0.66)均提取失敗。
5. 無(wú)意中搜到《打包SOAP 》這篇文章,其中的內(nèi)容起了決定性作用:
 1.將msm文件拷貝到InstallShield安裝目錄下的Objects文件夾下,例如:Macrovision\IS11.5\Objects   2.在InstallShield下,將相應(yīng)的msm合并模塊從上面的InstallShield objects/Redistributables選中( SOAP SDK Files ,SOAP SDK ISAPI Files和WinHTTP QFE Installer ) 原來(lái)msm文件是這樣用的呀
6. 選中打包以后,安裝測(cè)試,暈,依然報(bào)錯(cuò):WSDLReader: Loading of the WSDL file failed HRESULT=0x80040154: Class not registered.(沒(méi)有注冊(cè)類別) 7. google上搜索這個(gè)錯(cuò)誤,遇到了這篇文章KBAlertz.com: Error message when you try to access a Web service that is hosted on IIS: HRESULT=0x80040154 其中講到的一種情況與我這種情況一致:
 You include the redistributable files from the Microsoft SOAP Toolkit 3.0 in the client program installation package. 三種解決辦法中我用的是:
 Method 3: Install Microsoft XML Core Services 4.0 Service Pack 2  8.于是我在installshield中選入了msxml4.0(本來(lái)也找好了MSXML4.0 SP2的包,結(jié)果用msxml4.0就解決了,每用上)
9.打包測(cè)試
10.成功!
總結(jié): 首先,對(duì)于使用了soapToolkit3.0的客戶端程序,必須注冊(cè)需要的dll文件。 有人說(shuō)只需要注冊(cè)幾個(gè)dll文件(MSSOAP30.DLL,MSSOAPR3.DLL ,WISC30.dll ),沒(méi)有精力去追究是不是這樣了,而且這幾個(gè)文件也不再同一個(gè)msm文件中,所以我把三個(gè)msm文件都加進(jìn)去。 也有人說(shuō)手動(dòng)注冊(cè),但是對(duì)于安裝程序來(lái)說(shuō),手動(dòng)不再考慮之列。
然后,msm文件可以合并到別的msm文件或msi文件中。 雖然我沒(méi)有試驗(yàn)成功,但msm文件的初衷大概就是為了模塊化分發(fā)的,主要用于微軟的msi安裝包的制作。
其次,installshiel是可以將msm文件為我所用的 啟發(fā)來(lái)自《打包SOAP》這篇文章
最后,對(duì)安裝程序的測(cè)試一定要在空的操作系統(tǒng)上測(cè)試,不然,受到開發(fā)環(huán)境的影響,有些問(wèn)題很難發(fā)現(xiàn)。 制作期間也遇到了一些別的問(wèn)題,大多數(shù)是需要的文件沒(méi)有打在包里,就像vb里面的richtext.ocx和msflxgrd.ocx,有些文件是可以在installshield中的Redistributables選取的,在Redistributables里沒(méi)有提供的就得自己把文件加進(jìn)去。
|