當你完成一個應用軟件的開發後,那麼你還需要為該軟件做一個規範化的安裝程序,這是程序設計的最後一步,同時也是很重要的一步,因為運行安裝程序往往是用戶做的第一步操作。
很多報刊文章介紹了許多如何利用installshield等工具軟件來製作安裝程序的方法,這種辦法可以很快建立起較常見的安裝模式,但用這種辦法也有一些不足,如做成的安裝程序一般較大;風格較單一;不能靈活的控制啟動方式和快捷方式。其實安裝程序的的幾個運行步驟較固定,我們完全可以自己來編寫安裝程序。下面就詳細介紹如何用DELPHI編寫具有自己軟件特色的安裝程序。
安裝程序要達到的幾個原則,如配置的一次性等,在有關雜誌上已有許多文章介紹,就不再累述。這裡主要介紹安裝程序編寫中幾個主要過程:
1、將需要安裝的程序製作成資源文件
Step 1:編寫myres.rc資源腳本文件,可用記事本等編寫。
MYDBSRC mydbsrcfile c:/resdemo/mynbdb.mdb
MYDBJET mydbjetfile c:/resdemo/mdac_typ.exe
MYDBAPP mydbappfile c:/resdemo/Tnbdemo.exe
7001 Icon c:/resdemo/setup.ico
Step 2:利用BRCC32編譯生成資源文件myres.res。
brcc32.exe myres.rc
2、編寫安裝程序代碼
Step 1: 在setup.dpr文件中加入{$R mymyres.RES} 語句,這樣在編譯文件時包含資源文件。
Step 2: 編寫安裝程序背景界面。
//界面色彩漸變效果是通過用漸變的畫刷刷繪依次相鄰的矩形塊實現的。
//也可以實現其它特殊效果的安裝界面。
var i,j:Integer;
Dct:TRect;
begin
form1.WindowState:=wsMaximized;
j:=form1.width;
//獲得表單高度
for i:=0 to 255 do
//此處設置RGB()中一個顏色值
begin
Canvas.Brush.Color:=RGB(0,0,255-i);
//每次畫矩形的畫刷顏色(左,上,右,下)
//Dct:=Rect(i*2,0,(i+1)*2,j);
Dct:=Rect(0,i*2,j,(i+1)*3);
//每次刷繪的矩形區域
Canvas.FillRect(Dct);
Form1.Canvas.TextRect(Dct,30,40,''寧波大學課件管理系統v1.0'');
//填充顏色
end;
end;
Step 3:創建主程序工作目錄
//設置目錄環境及配置文件
if not DirectoryExists(EdtDir.Text) then
// if MessageBox(getfocus,''該目錄不存在,是否創建該目錄?'',''詢問'',1) = idOK then
try
ForceDirectories(EdtDir.Text);
except
MessageBox(getFocus,''創建目錄失敗!'',''信息'',0);
Exit;
end
// else Exit;
// ModalResult := mrOK;
Step 4:生成主程序配置文件
變量:
var
setupinfo : TiniFile;
//配置當前數據工作路徑,選擇與自己系統有關的驅動程序。
setupinfo:= Tinifile.Create( trim(FrmPathSelect.EdtDir.Text)+''/setup.ini'');
setupinfo.WriteString(''access'',''workdbpath'',trim(FrmPathSelect.EdtDir.Text)+''/mynbdb.mdb'';
setupinfo.WriteString(''access'',''backdbpath'',trim(FrmPathSelect.EdtDir.Text)+''/mynbdbbak.mdb'');
setupinfo.Free;
Step 5:從資源文件中還原有關文件。
變量:
var
res:tresourcestream;
resname,resnewname:string;
Regfile:TRegIniFile;
begin
//從資源文件中還原數據庫文件
resnewname:=trim(FrmPathSelect.EdtDir.Text)+''/mynbdb.mdb'';
resname:=''MYDBSRC'';
res:=tresourcestream.Create(hinstance,resname,pchar(''mydbsrcfile''));
res.savetofile(resnewname);
res.free;
//從資源文件中還原主程序文件
resnewname:=trim(FrmPathSelect.EdtDir.Text)+''/Tnbdemo.exe'';
resname:=''MYDBAPP'';
res:=tresourcestream.Create(hinstance,resname,pchar(''mydbappfile''));
res.savetofile(resnewname);
res.free;
//在註冊表中寫入主程序路徑名及執行文件名的信息,以便在
//升級主程序時用到。
RegFile := TRegIniFile.Create;
RegFile.RootKey := HKEY_LOCAL_MACHINE;
RegFile.WriteString(''SOFTWARE/mynb'',''exepath'',trim(resnewname));
RegFile.Free;
end
Step 6:安裝數據庫驅動(與SETP 4對應)
//安裝數據庫驅動程序
var
cmdlinepchar:array[0..120] of char;
startupinfo:tstartupinfo;
processinfo:tprocessinformation;
begin
screen.cursor:=crhourglass;
strpcopy(cmdlinepchar,trim(FrmPathSelect.EdtDir.Text)+''/mdac_typ.exe /q'');
fillchar(startupinfo,sizeof(startupinfo),#0); //置0
with startupinfo do
begin
cb:=sizeof(startupinfo);
dwflags:=startf_useshowwindow or startf_usestdhandles;
wshowwindow:=sw_hide; //隱藏被調用程序窗口
end;
if createprocess(nil,cmdlinepchar,nil,nil,true,0,nil,nil,startupinfo,processinfo) then
//創建進程
begin
waitforsingleobject(processinfo.HProcess,infinite); //等待進程結束
end
else
begin
exit;
end;
screen.cursor:=crDEFAULT;
DeleteFile(PChar(trim(FrmPathSelect.EdtDir.Text)+''/mdac_typ.exe''));
end;
Step 7:創建程序組
變量:
var
smacro:string;
szmacro:array[0..254] of char;
sgroupdesc,sgroupname:string;
sprogdesc:string;
sprogicon:string;
//創建主程序組
//打開對話通路
if ddeclientconv1.OpenLink then
begin
//建立組群
sgroupdesc:=''寧波大學課件管理系統'';
sgroupname:=''寧波大學課件管理系統v1.0'';
//組成宏指令
smacro:=''[creategroup(''+sgroupdesc+'',''+sgroupname+'')]'';
strpcopy(szmacro,smacro); //轉成null-term 字串
ddeclientconv1.ExecuteMacro(szmacro,false); //執行宏指令
//建立ICON圖像
sprogicon:=trim(FrmPathSelect.EdtDir.Text)+''/Tnbdemo.exe'';;
sprogdesc:=''寧波大學課件管理系統'';
smacro:=''[additem(''+sprogicon+'',''+sprogdesc+'')]'';
strpcopy(szmacro,smacro);
ddeclientconv1.ExecuteMacro(szmacro,false);
ddeclientconv1.CloseLink;
end;
Step 8:創建桌面快捷方式
//uses shlobj,comobj,activex;
var
tmpObject:IUnknown;
tmpSLink:IShellLink;
tmpPfile:IPersistFile;
PIDL:PItemIDList;
StartupDirectory : array[0..MAX_PATH] of Char;
StartupFilename : String;
LinkFilename : WideString;
c1:THandle;
begin
StartupFilename := ''''Tnbdemo.exe'''';
tmpObject := CreateComObject(CLSID_ShellLink);
tmpSLink := tmpObject as IShellLink;
tmpPFile := tmpObject as IPersistfile;
tmpSLink.SetPath(pChar(StartupFilename));
tmpSLink.SetWorkingDirectory(pChar(ExtractFilePath(StartupFilename)));
SHGetSpecialFolderLocation(0,CSIDL_DESKTOPDIRECTORY,PIDL);
SHGetPathFromIDList(PIDL,StartupDirectory);
LinkFilename := StartupDirectory + ''/mynotepad.lnk'';
showmessage(linkfilename);
tmpPFile.Save(pWChar(LinkFilename),FALSE);
c1:=windows.FindWindowEx(windows.FindWindowEx(windows.FindWindow(''Progman'',''Program Manager''),0,''SHELLDLL_DefView'',''''),0,''SysListView32'' ,'''');
PostMessage(c1,WM_KEYDOWN,VK_F5,0);
PostMessage(c1,WM_KEYUP,VK_F5,1 shl 31);
end;
Step 9:重新啟動機器
begin
ExitWindowsEx(2,0);
end;
以上是程序的主要語句部分,從本人的開發系統中剪出來,用到了一些WIN API的調用。在安裝過程中的一些提示性界面及每一個步驟大家可以根據自己的需要而製作,這樣做出來的安裝程序精練,而且風格可以做的很特別。