VS2008 安裝部署工程的小問題

之前都使用NSIS,寫腳本。後來換個公司,只使用InstallShield和VS2008。無奈學習了下。IS只使用Express版本,拖拽一下就搞定,也沒寫過腳本。基本還是不大懂得比較複雜的定製,有機會用到再說了。

倒是VS2008的,前兩天客戶提了個古怪的要求,要將一個LOGO文件,放到msi外面,以便他修改,安裝時,再把這個logo文件考到安裝目錄裏去。VS2008做的安裝程序,一向我只會常規的模式,這種要求看來非要自己動手添加點動作,到現在我也不知道怎麼給安裝程序添加腳本,還是不能?琢磨幾天,看來只有在custom action裏添加點私貨,來完成這件事了。

 

 圖1

在工程目錄視圖上可以看到一排按鈕,如圖1,紅框中就是custom action按鈕了。進入這個界面,vs2008一共預先定義了4個階段,安裝,提交,回滾,卸載。在這四個階段可以加入我們自己的動作。加入的方式是,運行你自己的exe,dll,vbs,js。它只支持這四種格式的文件。後兩種腳本我不會,我想這兩種腳本也主要是爲web安裝程序準備的吧。exe太扎眼,所以我選擇了在install階段使用dll(如圖2)。也就是說,我要在這個dll中把logo文件從原始目錄考到安裝目錄下。

 

圖2

這件事本來很簡單,我也不想複雜化。因此,最關鍵的地方就在於,怎麼把這兩個目錄作爲參數,傳遞給dll。又不知道寫腳本,貌似msdn上也沒有相關的詳細參考。還真是難住了。網上搜,msdn查,一步一步開始。
首先是建立dll工程,我在msdn上看到一段例子,當即拷貝下來建立爲我的工程了。具體代碼就不拷貝了,在主題Error Handling in Custom Actions下有一段dll的代碼,包括我後面調試也用來彈出messagebox,還挺好使。
接下來就是傳參數了,查看msdn發現了custom action的屬性裏面有一個CustomActionData,這個屬性是可以傳參數的(如圖3)。在dll中通過msi的API獲得。msi打頭的api有不少,還真不瞭解都是幹嘛的。介紹也不甚詳細,例程更是少。知道這裏可以傳參數,但是以什麼格式,怎麼取得,一無所知。

 圖3


繼續網上搜,所獲甚少,多是web安裝的。只能從中提取些有用信息。繼續返回msdn去查找。最開始我用getmodulepath這樣的api,返回的是msiexec的路徑,哦,我想,安裝程序是由msiexec啓動的,dll也在其中,所以返回的是這個路徑。然後我又查找msi的api,找到了msiGetSourcePath,msiGetTargetPath這樣的函數,但是收穫不大。這倆函數一直不能返回路徑,亂碼,原因不明。當我看到他們的第2個參數需要傳入一個路徑時,我估計這條路很困難。
仔細研究 CustomActionData Property主題下的內容。再仔細一個一個查看msi的API,發現了有MsiGetProperty這麼個函數。CustomActionData也是屬性,通過它能否取得傳入的參數呢?果然,當CustomActionData 賦值爲/name="[TARGETDIR]\"時,獲得了安裝路徑。直接賦值 [ProductName],可以獲得程序名稱。看來這條路可行。現在是要傳入兩個參數了。還是在MSDN上有寫, Each name must be unique and have only one value. Multiple values must be separated by a single space: /name1=value1 /name2=value2.就是這種形式:/name1=value1 /name2=value2.這裏還有一個問題,就是value的寫法,直接寫字符串是不行的,因爲地址是動態的。必須是宏或者代號之類的。例如,安裝目標路徑是TARGETDIR,那麼安裝程序所在的路徑呢?不知道,繼續查msdn,沒有發現有這樣說明文檔。如果我要別的參數呢?用戶的選擇,或者系統路徑,用戶路徑,桌面路徑,等等怎麼辦?沒有這樣一個比較全面的說明,還真是麻煩。然後網上搜索,找了幾個,試了好多次,終於發現,SourceDir,注意,大小寫不能錯。這個就是安裝程序所在的路徑了。

參數有了,dll中順利得到兩個路徑,如圖4,剩下的就是對字符串整理下,得到你要的路徑就可以了。這個問題就算解決了。

 

 圖4

如果沒有詳細的文檔,還是腳本來的直接。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章