自己用VC來做自己的專業安裝程式 (轉)

worldblog發表於2007-12-05
自己用VC來做自己的專業安裝程式 (轉)[@more@]

由於上次的巨大損失,關於本篇的幾百字說明全部化為一片泡影。下次有時間我一定花時間來恢復,現在先只提供和預覽。:~~~(
嘻嘻:)我這人太懶了,同樣的事情最多隻能做一遍,要我多做一遍,簡直就是要偶的命,這不沒有辦法嗎!

  縱觀(這個詞用得太大了吧:)所有見過的,除去一些常見的地板裡的安裝不過是簡單的對拷不談。最最專業的安裝程式要數我們所常見的InstallShield了,它擁有常用的大量對話方塊可供你選擇,並使用指令碼語言讓你像一樣來對的操作進行互動,熟練掌握了,可以任意定製你所想要的安裝程式,整個過程可以自己定義順序。(當然,我對它的瞭解實在是太少了)這麼說是想讓想做
自己安裝程式的同志們瞭解一下我們下一步該做的工作有哪些。我的這個安裝程式也是模仿InstallShield所製作的。

  考慮到實現細節,首先是要繪製大量的對話方塊(這個好說),我用的方法是直接用一些可檢視EXE、DLL等擁有資源的程式(VC就可以了)。用它來開啟某一個InstallShield的安裝程式,直接COPY對話方塊資源到你的應用程式裡,然後修改一下你所想要修改的字串就可以了。接下來的是我們對各種使用的程度(一些簡單的如CButtonCStatic的我就不講了:),最後的也是最重要的,我大致分了這麼幾項,應該有:

1. 定製自己的控制元件。
一般是在現有控制元件的基礎上進行修改。
如CTreeCtrl裡實現Check,其實它有Check框的,可是太難看了。所以我想要定製一個。在CTreeCtrl裡用CImageList來繪製每一個Item的圖示。透過這樣我們就可以實現自己的Check框了。

CImageList *image;
image = new CImageList();
image->Create(13, 13, TRUE, 4, 4);
image->Add(AfxGetApp()->LoadIcon(IDI_NOT_CHECKED));// 沒有選中的ICON
image->Add(AfxGetApp()->LoadIcon(IDI_CHECKED)); // 全選中的ICON
image->Add(AfxGetApp()->LoadIcon(IDI_CHECKED_PART));// 只選中部分的ICON
m_tree.SetImageList(image, LVSIL_NORMAL);

接著用一個CUIntArray來記錄下每一個Item的狀態。當然,我們要從原來的CTreeCtrl中繼承一個新類CTreeCtrlEx,過載其InsertItem
方法。初始這個動態無符號整型陣列的狀態,這個值為0或1,表示選中和沒選中。剩下那個部分選中的ICON只是用來表示父項的狀態。
單獨的,下面再沒有子項的選項只有0或1兩種狀態。

然後每次 lClk 樹中的Item則首先改變對應狀態值,假設為uState,再用 m_tree.SetItemImage(hItem, uState, uState);
於是我們的目的就實現了。

2. 看到InstallShield(很多程式都有)這樣的一種“嚮導對話方塊”,它用上一步和下一步來對使用者進行引導。感覺十分得方便。
這是如何實現的呢?我在程式設計師大本營光碟中找到一個 CWizardDlg 嚮導對話方塊,使用非常地方便。具體使用見/Setup.zip">原始碼 936K 。

3. 對於使用者大量的設定資訊要進行儲存,方法要靈活。因為使用者可任意點選上一步和下一步來設定或修改安裝選項。這裡我用的是INI檔案。

大致幾個難點如上。我想看我這篇文章和下載的人可以
1.在現有基礎上作一定修改以做出適應自己所需的個人安裝程式
2.原始碼中有一些常用控制元件的使用方法,可以借鑑 。

文章和程式碼寫得都不是很好,請大家見諒!

  上面寫的是原先做的程式,後來BOSS改變了主意,又重新寫一遍。下面是對新的安裝程式的介紹,很漂亮的。     原來的安裝程式不知道大家看過沒有,現在這個是經過美工處理後的最終版,很漂亮的哦:)  裡面相對於原來的做了很大的改動,無論是從花哨還是從穩定性上來說都做了很多的修改。很有看頭哦!裡面有一個DDE.CPP,是用來建立程式組的,很好用的。

  不曉得大家做過反安裝的程式沒有,反正我原來沒有做過。為什麼特地把它單獨拿出來談呢,是因為有這麼一種特殊情況。一般反安裝程式,首先要看我們這個將要被反安裝的程式涉及到了哪些,如登錄檔、INI檔案、程式組等等(這些東東我們在反安裝時都要記得把它們恢復到安裝前的狀態)。其中還有一件必須要做的就是要把安裝上去的內容從使用者的上刪掉。為了刪除整個安裝的目錄,我們一般會用遞迴寫一個類似於原來DOS命令裡的 Deltree 的(用遞迴的原因是因為目錄下子目錄的存在)。

  但是在安裝時,反安裝程式也應該在安裝的目錄下(比方說和主程式同一級目錄)。這時如果使用者要解除安裝程式,將出現一個錯誤,原因是我們這個反安裝程式要自己刪自己:) 而程式此時正在被。所以,不能簡單地這樣處理。:~~~(
到了最後,我想為了避免這個問題,要做一個標記,我的方法是在臨時資料夾裡生成一個檔案,首先看看臨時資料夾裡有沒有指定檔案。如果有,說明副本正在執行,沒有則先將自己copy一份到臨時資料夾裡,然後先副本,再將自己退出 。
在副本程式執行完解除安裝工作後,刪除標記(殺人滅口:)。     這樣就可以了,是不是很簡單?其實程式不光只是靠技術,想法也是很重要的!拿遊戲來說吧,<>不知大家玩過沒有,它就沒用什麼很高明的技術。     就在剛剛,我又知道了另一種更完美的方法用來在程式結束前刪除此程式的EXE檔案。摘自,具體內容請看我的一篇轉貼/develop/read_article.?id=4206">在PROCESS沒有結束前就將啟動PROCESS的EXE檔案刪除

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988581/,如需轉載,請註明出處,否則將追究法律責任。

相關文章