制作一个完整的应用程序安装实例3.docx
《制作一个完整的应用程序安装实例3.docx》由会员分享,可在线阅读,更多相关《制作一个完整的应用程序安装实例3.docx(28页珍藏版)》请在冰豆网上搜索。
制作一个完整的应用程序安装实例3
这里有必要提示一下,由于用户数据源的配置可能包含一些敏感的数据库设置,比如说连接数据库的用户ID和口令。
这些设置都会以无格式的文本形式存储在注册表中,可以很容易的被Windows注册表编辑程序regedit.exe或regedt32.exe查看,只要有点编程经验的人都能通过获这些实用工具取该ID和口令来修改数据库中数据。
因此,你在处理这些问题的时候还要三思一下,你可以选择加密口令或让用户在连接数据库时录入。
既然我们知道了如何在注册表中为应用程序进行ODBC配置,那么剩下的问题是,把他们放在什么地方?
不用说,大家也猜到了,最好的地方就是当所有文件都已经复制完毕,在我们要求用户重新启动系统之前。
事件OnMoved可以做到这一切。
在做这些事的同时我们最好能够显示给用户一个消息框,告诉用户我们在干什么,做完这一切之后再关闭它。
这就要用到函数SdShowMsg和Delay。
见图。
相关事件:
OnMoved
该事件是在当所有在目标机器上的组件都被安装或反安装时响应,在该事件中的代码总是会被执行。
相关函数:
SdShowMsg:
该函数打开或关闭一个非模态的小窗口,该窗口显示指定的消息。
Delay:
该函数可以用指定的时间(秒)来使安装程序的执行时间延迟。
下面是完整的ODBC注册表配置的代码程序。
/*********************程序代码********************/
//*******当所有数据拷贝完毕后在这里配置ODBC
functionOnMoved()
STRINGszMsg;
STRINGsvDB;
STRINGsvASAOdbcDll;
STRINGsvASA;
STRINGszKey;
STRINGszClass;
STRINGsvResult;
STRINGszNumName,szNumValue,svNumValue,szTitle;
NUMBERnType,nSize,nvType,nvSize;
begin
szMsg="正在进行系统配置,请等待...";
SdShowMsg(szMsg,TRUE);
svDB=TARGETDIR+"\\db\\Demo.db";
svASAOdbcDll=TARGETDIR+"\\ASA\\dbodbc6.dll";
svASA=TARGETDIR+"\\ASA\\dbeng6.exe";
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
//建立MyDemoASA主键
szKey="Software\\ODBC\\ODBCINST.INI\\MyDemoASA";
szClass="";
if(RegDBCreateKeyEx(szKey,szClass)<0)then
MessageBox("注册表操作失败,安装程序将终止!
",SEVERE);
abort;
endif;
//建立MyDemoASA下的键值
szNumName="Driver";
szNumValue=svASAOdbcDll;
nType=REGDB_STRING;
nSize=-1;
if(RegDBSetKeyValueEx(szKey,szNumName,nType,szNumValue,
nSize)<0)then
MessageBox("注册表操作失败,安装程序将终止!
",SEVERE);
abort;
endif;
szNumName="Setup";
if(RegDBSetKeyValueEx(szKey,szNumName,nType,szNumValue,
nSize)<0)then
MessageBox("注册表操作失败,安装程序将终止!
",SEVERE);
abort;
endif;
szKey="Software\\ODBC\\ODBCINST.INI\\ODBCDrivers";
szNumName="MyDemoASA";
szNumValue="Installed";
if(RegDBSetKeyValueEx(szKey,szNumName,nType,szNumValue,
nSize)<0)then
MessageBox("注册表操作失败,安装程序将终止!
",SEVERE);
abort;
endif;
//*************配置ODBC
RegDBSetDefaultRoot(HKEY_CURRENT_USER);
//建立Mydemo
szKey="Software\\ODBC\\ODBC.INI\\MyDemo";
if(RegDBCreateKeyEx(szKey,szClass)<0)then
MessageBox("注册表操作失败,安装程序将终止!
",SEVERE);
abort;
endif;
szNumName="AutoStop";
szNumValue="Yes";
nType=REGDB_STRING;
nSize=-1;
if(RegDBSetKeyValueEx(szKey,szNumName,nType,szNumValue,
nSize)<0)then
MessageBox("注册表操作失败,安装程序将终止!
",SEVERE);
abort;
endif;
szNumName="DatabaseFile";
szNumValue=svDB;
if(RegDBSetKeyValueEx(szKey,szNumName,nType,szNumValue,
nSize)<0)then
MessageBox("注册表操作失败,安装程序将终止!
",SEVERE);
abort;
endif;
szNumName="Description";
szNumValue="MyPaper'sSample";
if(RegDBSetKeyValueEx(szKey,szNumName,nType,szNumValue,
nSize)<0)then
MessageBox("注册表操作失败,安装程序将终止!
",SEVERE);
abort;
endif;
szNumName="Driver";
szNumValue=svASAOdbcDll;
if(RegDBSetKeyValueEx(szKey,szNumName,nType,szNumValue,
nSize)<0)then
MessageBox("注册表操作失败,安装程序将终止!
",SEVERE);
abort;
endif;
szNumName="PWD";
szNumValue="SQL";
if(RegDBSetKeyValueEx(szKey,szNumName,nType,szNumValue,
nSize)<0)then
MessageBox("注册表操作失败,安装程序将终止!
",SEVERE);
abort;
endif;
szNumName="Start";
szNumValue=svASA+"-d-c8m";
if(RegDBSetKeyValueEx(szKey,szNumName,nType,szNumValue,
nSize)<0)then
MessageBox("注册表操作失败,安装程序将终止!
",SEVERE);
abort;
endif;
szNumName="UID";
szNumValue="DBA";
if(RegDBSetKeyValueEx(szKey,szNumName,nType,szNumValue,
nSize)<0)then
MessageBox("注册表操作失败,安装程序将终止!
",SEVERE);
abort;
endif;
//***************注册数据源
szKey="Software\\ODBC\\ODBC.INI\\ODBCDataSources";
szNumName="MyDemo";
szNumValue="MyDemoASA";
if(RegDBSetKeyValueEx(szKey,szNumName,nType,szNumValue,
nSize)<0)then
MessageBox("注册表操作失败,安装程序将终止!
",SEVERE);
abort;
endif;
//UInstalled--反安装后删除新建的键
if(FindFile(TARGETDIR+"\\db\\","Demo.db",svResult)<0)then
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
szKey="Software\\ODBC\\ODBCINST.INI\\MyDemoASA";
if(RegDBDeleteKey(szKey)<0)then
MessageBox("删除注册表数据失败!
",SEVERE);
endif;
szKey="\\Software\\ODBC\\ODBCINST.INI\\ODBCDrivers";
if(RegDBDeleteValue(szKey,"MyDemoASA")<0)then
MessageBox("删除注册表数据失败!
",SEVERE);
endif;
RegDBSetDefaultRoot(HKEY_CURRENT_USER);
szKey="Software\\ODBC\\ODBC.INI\\MyDemo";
if(RegDBDeleteKey(szKey)<0)then
MessageBox("删除注册表数据失败!
",SEVERE);
endif;
szKey="Software\\ODBC\\ODBC.INI\\ODBCDataSources";
if(RegDBDeleteValue(szKey,"MyDemo")<0)then
MessageBox("删除注册表数据失败!
",SEVERE);
endif;
endif;
//UInstalled--end
Delay
(1);
SdShowMsg(szMsg,FALSE);
end;
/*********************结束********************/
在进行完成注册表的添加之后还必须做的最后一件事就是为我们的应用程序指定一个搜索路径,因为我们在安装的时候拷贝了一些DLL库文件。
显儿易见这就要求我们在Autoexec.bat中文件添加一个搜索路径。
涉及到的函数:
*FindFile:
在指定的路径下查找指定的文件,当函数返回0时表示文件找到,当返回小于0的任何数时表示没有找到。
*CreateFile:
创建一个新的文件,如果该文件已经存在,那么CreateFile将覆盖掉原先的。
同样,在创建之前要先用OpenFileMode设置文件模式。
*OpenFileMode:
在你想要打开一个已存在的文件或建立一个新文件设置文件的模式。
文件的模式根据文件类型的不同会有如下几种:
文本文件:
添加模式,只读模式
二进制文件:
只读模式,读写模式
*OpenFile:
打开一个已经存在的文本文件或二进制文件。
但打开之前必须先要用OpenFileMode设置文件打开的模式。
*WriteLine:
该函数在一个以添加模式(appendmode)打开或建立的文本文件中写上一行文本。
*CloseFile:
当你完成用GetLine读文件或用WriteLine写文件的操作后必须用CloseFile函数将使用的文件关闭。
*LongPathToQuote:
在长文件名上放置或去掉双引号。
因为如果是没有加引号的长文件名PAHT命令是不会认的。
具体的实现代码如下:
/**********************程序代码******************/
//在Autoexec.bat中加入搜索路径
functionOnMoved()
STRINGsvResult;
NUMBERnvFileHandle;
STRINGsvDir;
Begin
......
OpenFileMode(FILE_MODE_APPEND);
if(FindFile("c:
\\","autoexec.bat",svResult)<0)then//没有,需要create一个
CreateFile(nvFileHandle,"c:
\\","Autoexec.bat");
else
OpenFile(nvFileHandle,"C:
\\","Autoexec.bat");
endif;
svDir=TARGETDIR+"\\DLL";//将路径指向DLL目录
LongPathToQuote(svDir,TRUE);
WriteLine(nvFileHandle,"");
WriteLine(nvFileHandle,"SetPATH="+svDir+";%PATH%");
WriteLine(nvFileHandle,"");
CloseFile(nvFileHandle);
end;
/**********************结束******************/
到目前为止,我们已经完成了制作一个应用程序的安装实例所需要的全部工作。
剩下的也只是一些锦上添花的事了。
让我们最后再看看还有什么要做的?
对了,还应该像其他专业软件那样在开始菜单中或者是在桌面上或者是在程序文件夹中添加快捷方式,这样用户在安装完毕之后可以很方便的找到它。
在这里我们将会用到函数AddFolderIcon。
相关函数:
AddFolderIcon
该函数在指定的程序文件中插入或替换图标。
下面是具体的实现代码:
/******************程序代码******************/
functionOnMoved()
STRINGszProgramFolder,szItemName,szCommandLine,szWorkingDir,szIconPath;
STRINGszShortCutKey,szProgram,szParam;
NUMBERnIcon;
begin
//SzProgramFolder=FOLDER_STARTMENU;
//SetupparametersforcalltoAddFolderIcon.
szProgram=FOLDER_STARTMENU;
szParam=TARGETDIR+"\\Demo.exe";
LongPathToQuote(szProgram,TRUE);
LongPathToShortPath(szParam);
szCommandLine=szParam;
szWorkingDir=TARGETDIR+"\\DLL";//加上应用程序的工作路径
szIconPath="";
nIcon=0;
szShortCutKey="";
//在开始菜单中添加快捷方式
szProgramFolder=FOLDER_STARTMENU;
szItemName="MyDemoinStartMenu";
if(AddFolderIcon(szProgramFolder,szItemName,szCommandLine,szWorkingDir,
szIconPath,nIcon,szShortCutKey,REPLACE)<0)then
MessageBox("安装程序在进行开始菜单中添加快捷方式失败,稍侯请自己添加!
.",SEVERE);
endif;
//在程序文件夹中添加快捷方式
szProgramFolder=FOLDER_PROGRAMS;
szItemName="MyDemoinPrograms";
if(AddFolderIcon(szProgramFolder,szItemName,szCommandLine,szWorkingDir,
szIconPath,nIcon,szShortCutKey,REPLACE)<0)then
MessageBox("安装程序在进行程序文件中添加快捷方式失败,稍侯请自己添加!
.",SEVERE);
endif;
//在桌面上添加快捷方式
szProgramFolder=FOLDER_DESKTOP;
szItemName="MyDemoinDesktop";
if(AddFolderIcon(szProgramFolder,szItemName,szCommandLine,szWorkingDir,
szIconPath,nIcon,szShortCutKey,REPLACE)<0)then
MessageBox("安装程序在进行桌面上添加快捷方式失败,稍侯请自己添加!
.",SEVERE);
endif;
end;
/******************结束******************/
当然了,我们还得在卸载程序中加上删除这些快捷方式的代码,否则的话当用户删除了我们的应用程序后会对我们的程序怒发冲冠的,我当然不希望这样。
/***************程序代码***************/
//删除桌面上的快捷方式
if(DeleteFolderIcon(FOLDER_DESKTOP,"MyDemoinDesktop")<0)then
MessageBox("安装程序在删除桌面上的快捷方式的时候出错,稍侯请自己删除!
.",SEVERE);
endif;
//删除开始菜单中的快捷方式
if(DeleteFolderIcon(FOLDER_STARTMENU,"MyDemoinStartMenu")<0)then
MessageBox("安装程序在删除开始菜单中的快捷方式的时候出错,稍侯请自己删除!
.",SEVERE);
endif;
//删除程序文件夹中的快捷方式
if(DeleteFolderIcon(FOLDER_PROGRAMS,"MyDemoinPrograms")<0)then
MessageBox("安装程序在删除程序文件夹中的快捷方式的时候出错,稍侯请自己删除!
.",SEVERE);
endif;
/***************结束***************/
好了,我们可以拿着这个安装程序向老板领赏了。
还不赶快制作一个具有专业级水平的应用程序安装盘来分发给我们的客户。
相信他们一定会瞪大眼睛惊叹我们的软件开发水平是一流的。
废话不说了,现在就开始行动!
总结
至此,所有图例的有关技术已经全部讲述完毕。
总之,InstallShield博大精深,我所叙述的只是一些皮毛而已,如果大家对她想更深入的了解还是请看她自带的帮助文档。
不过,最后我还是要多说一句,千万不要忘了编写一个详细,完整的用户手册。
这可是用户最需要的,但同时也是我们最懒得去做的一件事。