文章内容

最新教程制造一个残缺的运用程序装置实例

时间:2018-05-16 08:14来源:网络整理 作者:珠海翻译公司 点击:

Odbccr42.dll  
MessageBox ("删除注册表数据失败!", SEVERE);  

Enable(STATUSEX);  
类型  
MessageBox ("内存检测失败,装置程序将终止!.", SEVERE);  
Ds26gt.dll  
end;  
/******************完结*********************/  
szTitle = "已经实现全副的拷贝任务,";  
2、 在dbeng6.exe后加上“-q”是为了隐藏义务栏上的SQLAnywhere窗口。  
svASA = TARGETDIR + "\\ASA\\dbeng6.exe";  
* CreateFile:创建一个新的件,假设该文件已经存在,那么CreateFile将笼罩掉原先的。异样,在创建之前要先用OpenFileMode设置文件形式。  
goto Dlg_SdAskDestPath;  
Begin  
STRING szTitle, szMsg2, szMsg2;  
Msjter40.dll  

if (AddFolderIcon (szProgramFolder, szItemName, szCommandLine, szWorkingDir,  
这一步由InstallShield主动给出,普通不要做任何修正。  
Path\win42\dbeng6.exe -q  
Path\demo.db  
Dbcon6.dll  
svDir = TARGETDIR + "\\DLL"; // 将门路指向DLL目录  
endif;  
 
该函数用来在注册表中创建一个键。当利用该函数来创建一个键或子键时,为了保证能被正确地装置软件卸载程序注销要首先确保它的父键首先已经被胜利创建。  
endif;  

case TYPICAL : ListAddString(listStartCopy,"装置类型:典型装置",AFTER);  
某些文件是多个部件共同需求的。假设你想要和你的运用程序一同重新分配任一个 ODBC 桌面数据库驱动程序,这些文件也必须被重新分配。建议在散发软件时在你的运用程序目录下建设一个 “\ODBC\”目录,将这些重新拷贝到该目录底下,但肯定要确保该门路是个PATH搜寻门路。  

四、 答应协定  
Dblgen6.dll  
Msjtes40.dll  
键HKEY_CURRENT_USER通常为咱们的运用程序存储和恢复特殊用户相应的特殊配置提供了方便。异样,在HKEY_CURRENT_USER中也存在一些子键,最罕用的键是Software,关上Software键咱们会发现有一个子键ODBC,望文生义里面寄存的以后机器上的ODBC.INI文件的内容,  
nSize) < 0) then  
szKey = "Software\\ODBC\\ODBC.INI\\MyDemo";  
在停止实现注册表的减少之后还必须做的最后一件事就是为咱们的运用程序指定一个搜寻门路,由于咱们在装置的时分拷贝了一些DLL库文件。显儿易见这就要求咱们在Autoexec.bat中文件减少一个搜寻门路。  
好了,咱们可能拿着这个装置程序向老板领赏了。还不赶快制造一个具备业余级程度的运用程序装置盘来散发给咱们的客户。相信他们肯定会瞪大眼睛惊叹咱们的软件开发程度是一流的。废话不说了,如今就末尾举动!  
case COMPACT: ListAddString(listStartCopy,"装置类型:紧缩装置",AFTER);  

MessageBox (szMsg, SEVERE);  
endif;  

abort;  
szIconPath = "";  
svSerial = "";  
相干事情:OnMoved  
if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,  
修正成如下:  
MessageBox ("注册表操作失败,装置程序将终止!", SEVERE);  
SdShowMsg (szMsg, FALSE);  
* OpenFileMode:在你想要关上一个已存在的文件或建设一个新文件设置文件的形式。文件的形式根据文件类型的不同会有如下几种:  
咱们首先需求定义一个暂时字符串变量svTemp  

szProgram = FOLDER_STARTMENU;  
szProgramFolder = FOLDER_DESKTOP;  
衔接对话框程序言件  
十、 程序言件夹  
if (nResult = BACK) goto Dlg_SdShowInfoList;  
//*******当一切数据拷贝终了后在这里配置ODBC  
szNumValue = svASAOdbcDll;  
// end.  
nOption = 0;  
TARGETDIR = PROGRAMFILES ^@COMPANY_NAME ^@PRODUCT_NAME;  
2、 网络接口程序库是专门用于网络通讯誉,它仅仅是在客户端的程序访问网络服务器上才必须存在。  
当你需求显示布告板之前还必须确保以下两个条件:  
if (FindFile("c:\\", "autoexec.bat", svResult) < 0) then //没有,需求create一个  
szCommandLine = szParam;  
if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,  
nIcon = 0;  
//end.  
2、 用户最终抉择的是哪个硬盘  
begin  
endif;  
* CloseFile:当你实现用GetLine读文件或用WriteLine写文件的操作后必须用CloseFile函数将利用的文件封闭。  
szNumName = "UID";  

ListAddString(listStartCopy,"程序装置门路:" + szDir,AFTER);  
else  
// end.  
abort;  
函数一:GetDisk  
c. 不管是出于什么目标用户需求显示衔接对话框  
SYSINFO.WINNT.bWinNT4 ||  
相干函数:  
szNumName = "AutoStop";  
ODBC驱动程序  
TARGETDIR = szDir;  

Enable(FULLWINDOWMODE);  
// UInstalled -- 反装置后删除新建的键  


42位Windows  
特殊言语库文件  
 

 
/********************** 完结 ******************/  
4、 衔接对话框程序言件在以下的几种情况下才需求退出:  

end;  
abort;  
szNumName = "PWD";  
那么,如何来完成呢?幸而InstallShield为咱们提供了足够多的函数来寒暄这所有。  
String  
if (RegDBDeleteKey (szKey) < 0) then  
要说起制造装置程序的软件有许多,像InstallShield,CreateInstall,Easy Install,EasySetup,SetupBuilder等等,可能举出一大堆来。但其中最为著名的当属InstallShield。目前世界上绝大少数的商业软件的装置盘都是用她来实现,比如咱们能够天天在利用的Norton AntiVirus 2000。  
endif;  
if ( nvFreeMem < 26484 ) then  
Sql  
Enable(FULLWINDOWMODE):设置主背景窗口为最大化。  
Driver  
Enable(BACKGROUND);  
见下面阐明  
if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,  
if (RegDBDeleteValue (szKey, "MyDemo ASA") < 0) then  
不要认为加上了单位和程序的目录就高枕无忧了,可别忘了既然让用户来抉择装置的目标盘就很有能够出现磁盘空间不够大,从而导致程序的装置失败或装置后的剩余空间不够程序将来数据的寄存等等。因此,必须在用户抉择之后,程序进入下一步之前对目标盘的可用空间停止判别。在这里我假定咱们的程序需求20兆的空间来寄存目前的文件和未来几年能够的数据。  
第二步:;InstallShield初探  
Odbc26gt.dll  
if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,  
当然,我不能够具体到怎么建设一个名目之类的成绩,无关这方面的内容还请看InstallShield的入门教材。  
相干函数:AskYesNo  
if ( svTemp != szDir) then  
abort;  
endif;  
begin  
szKey = "Software\\ODBC\\ODBC.INI\\ODBC Data Sources";  
if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,  
二、ODBC  
Odbcinst.hlp  
szMsg = "揭示:该软件只能运转在WIN0X系统上能力确保程序的失常任务!\n\n能否持续装置?";  
if (GetSystemInfo (EXTENDEDMEMORY, nvFreeMem, svResult) < 0) then  
不知道你有没有留意到窗口的右面有一个阐明框,它是用来揭示用户目前所抉择的组件是干什么的。在缺省的形状下它是空的,需求咱们来减少。减少的方法是在组件(Components)的面板中,每当咱们点中一个组件在左边的列表中就会有一个形容栏(Description),它的内容就是上面提到的协助信息,你只需将相对用户说的话写下来就行了。  
szWorkingDir = TARGETDIR + "\\DLL"; // 加上运用程序的任务门路  
这里有必要揭示一下,因为用户数据源的配置能够蕴含一些敏感的数据库设置,比如说衔接数据库的用户ID和口令。这些设置都会以无格局的文本方式存储在注册表中,可能很容易的被Windows注册表编辑程序regedit.exe或regedt42.exe查看,只需有点编程阅历的人都能经过获这些适用工具取该ID和口令来修正数据库中数据。因此,你在解决这些成绩的时分还要三思一下,你可能抉择加密口令或让用户在衔接数据库时录入。  
// 建设MyDemo ASA主键  
//***************注册数据源  
在HKEY_LOCAL_MACHINE中保存的是关于本地机器的配置信息,独立于任何特殊的用户都存储在其中。此配置信息又进一步分成几个不同的子键,它们是Config,Enum,Hardware,Network,Security,Software和System。  
nSize = -2;  
szIconPath, nIcon, szShortCutKey, REPLACE) < 0) then  
// 假设不手动退出的话将会什么也不列出  
if (DeleteFolderIcon (FOLDER_STARTMENU, "My Demo in StartMenu") < 0) then  
下面是详细的实现代码:  
2、 ODBC 桌面数据库驱动程序4.0版本至少需求 26 MB 的随机访问内存 (RAM)  
nResult = SdRegisterUserEx( szTitle, szMsg, svName, svCompany, svSerial );  
Vbajet42.dll  
/*********************程序代码********************/  
WriteLine( nvFileHandle," ");  

键名  
function OnBegin()  
MessageBox ("注册表操作失败,装置程序将终止!", SEVERE);  
MessageBox("警告:装置门路所在的磁盘空间无余20M!请重新抉择!",SEVERE);  
除了停止ODBC驱动程序注册外,还必须为用户的数据源停止注册。这是由于每一个用户数据源必须被注册表注销能力被系统所辨认,这样用户能力利用它。因此,必须在键HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\中停止如下注册。  
注:  
MessageBox ("注册表操作失败,装置程序将终止!", SEVERE);  
相干函数:GetSystemInfo()  
详细实现代码如下:  

endif;  
4、配置ODBC驱动程序  
STRING svASA;  
/********************* 完结 ********************/  
另外,必须将数据源加到注册表中的数据源列表中,退出到如下键中  
GetDisk (szDir, svDrive);  

RegDBSetDefaultRoot (HKEY_LOCAL_MACHINE);  

到目前为止,咱们已经实现了制造一个运用程序的装置实例所需求的全副任务。剩下的也只是一些精益求精的事了。让咱们最后再看看还有什么要做的?对了,还应该像其余业余软件那样在末尾菜单中或许是在桌面上或许是在程序言件夹中减少快捷模式,这样用户在装置终了之后可能很方便的找到它。在这里咱们将会用到函数AddFolderIcon。  
普通情况下,咱们是在事情OnEnd中调用SdFinishReboot函数。OnEnd望文生义是在Setup脚本里最后被执行的事情。程序代码如下:  
 
if (RegDBCreateKeyEx(szKey, szClass) < 0) then  
像其它编程工具一样,InstallShield也为咱们提供了一些系统变量,应用这些变量咱们可能轻而易举的失去一些像系统目录,言语代码,CUP类型等适用数据。  
//The following is an example of how to add a string(svName) to a list(listStartCopy).  
Dbport6.dll  
if ( !AskYesNo (szMsg, NO)) then  
变量TARGETDIR是指向在硬盘上目标文件夹的残缺门路。当调用函数SdAskDestPath时,该函数会创建一个对话框来让用户抉择运用程序要寄存的目标门路。  
STRING svTemp;  
文件  
STRING szMsg;  
szNumName = "Driver";  
2、 RegDBKyeExist  
2、 ODBC翻译程序仅仅在你的运用程序是依赖于ANSI规范的字符串转换。  

begin  
end;  
// 建设Mydemo  

至此,一切图例的无关技术已经全副讲述终了。总之,InstallShield博大精湛,我所叙说的只是一些皮毛而已,假设大家对她想更深化的了解还是请看她自带的协助文档。  
endif;  
/******************程序代码******************/  

 
if (nResult = BACK) goto Dlg_SdRegisterUserEx;  
abort;  
if (RegDBCreateKeyEx(szKey, szClass) < 0) then  
在查阅了InstallShield系统变量后并没有找到无关内存容量方面的变量,因此只要经过调用函数来完成。  
szNumName = "Start";  
MessageBox ("注册表操作失败,装置程序将终止!", SEVERE);  
其中,szTitle、szMsg2、szMsg2不设置也罢,只是系统会以缺省的模式出现。  
ListAddString(listStartCopy,"用户名:" + svName,AFTER);  
lFreeSpace = GetDiskSpace (svDrive);  
MessageBox ("注册表操作失败,装置程序将终止!", SEVERE);  

STRING szClass;  
 
nSize = -2;  
szNumValue = svASAOdbcDll;  
szIconPath, nIcon, szShortCutKey, REPLACE) < 0) then  
二、 设置启动画面  
MessageBox ("注册表操作失败,装置程序将终止!", SEVERE);  
Path\dbodbc6.dll  
Dba  
TARGETDIR = szDir;  
szKey = "Software\\ODBC\\ODBCINST.INI\\MyDemo ASA";  
RegDBSetItem(REGDB_APPPATH_DEFAULT, szAppPath ^ @PRODUCT_KEY);  

十四、 重新启动  
STRING svASAOdbcDll;  
nResult = SdAskDestPath( szTitle, szMsg, szDir, 0 );  
nSize) < 0) then  
MessageBox(szMsg, SEVERE);  
Dlg_SdRegisterUserEx::  
if (AddFolderIcon (szProgramFolder, szItemName, szCommandLine, szWorkingDir,  
2、 HKEY_LOCAL_MACHINE  
if (SdFinishReboot (szTitle, szMsg2, nOption, szMsg2, nReserved) < 0) then  
Delay (2);  
String  
listStartCopy = ListCreate( STRINGLIST );  

只管继ODBC之后业界已推出了一些像OLE DB,ADO等之类的新技术,但目前,开放式数据库衔接API兴许是在Windows运用程序中用得最宽泛的数据库接口。在每种数据库所用到的公用接口中,除了退出特殊代码外,还需求为ODBC API译码。在ODBC API和用来与数据库替换信息的公用接口之间,特殊的ODBC驱动程序提供了任何一种必需的译码。  
第三步:深度探求  
if ( !SYSINFO.bIntel) then  
switch (nSetupType)  

Odbcji42.dll  
abort;  
szKey = "\\Software\\ODBC\\ODBCINST.INI\\ODBC Drivers";  

大家都知道,咱们开发的程序有百分之九十以上是和数据库打交道。目前,数据库种类的繁多,各软件厂商又各自推出本人的数据库接口程序,韩语翻译,这就使得咱们要确保开收回来的运用程序最终可以平安顺利的运转就必须携带上本人的数据库接口程序,只管有一些接口规范,但这远远不够。因此,如何将这些任务交给装置程序去实现就成为是否制造出具备业余水准的装置程序的关键,也是为什么我会把它作为一个题目单独来到。  
endif;  
function OnMoving()  
/***************程序代码***************/  
nSize) < 0) then  
 
endif;  
Description  
Odbctrac.dll  
就行了。  
4、 RegDBCreateKeyEx  
OnFirstUIBefore:在运用程序第一次装置时为了收集用户信息而弹出的对话框之前,运用程序所照应的事情。  
Adaptive Server Anywhere  
九、 装置类型  
abort;  
nSetupType = TYPICAL;  
nResult = SdAskDestPath( szTitle, szMsg, szDir, 0 );  
MessageBox ("装置程序在停止桌面上减少快捷模式失败,稍侯请本人减少!.", SEVERE);  
szNumValue = "My Paper's Sample";  
TARGETDIR = szDir;  

endif;  
ODBC,即开放式数据库衔接,它是由Microsoft公司提供的运用程序接口(API),一个单独的运用程序经过它可能访问许多个不同类型的数据库及不同格局的文件。  
nResult = SdStartCopy( szTitle, szMsg, listStartCopy );  

end;  
WriteLine( nvFileHandle," ");  
szParam = TARGETDIR + "\\Demo.exe";  
看一看图片,不难发现当装置程序运转这一步时上面已经填上了缺省的用户名和客户称号,甚至连序列号都有。这是怎样回事呢?原来在前面咱们引见的事情OnFirstUIBefore的末尾有一段代码,如下:  
另外,咱们有时宿愿咱们所开收回来的运用程序装置在一个带有本人公司称号和运用程序称号的目录下。InstallShield默许的目录就做的十分好,她会建设一个诸如“C:\Program Files\ABCD软件任务室\Demo”的目录(在这里我虚拟了一个公司“ABCD软件任务室”)。但,成绩是,一旦让用户抉择了其它的门路,或许硬盘,他们几乎都不会在目录上加上开发商和运用程序目录,“\ABCD软件任务室\Demo”。假设用户仅仅抉择了磁盘而忘了抉择任何目录的话,InstallShield就会将一切的程序和数据文件复制到磁盘根目录下,用户和咱们当然都不宿愿这样。因此,为了避免这所有的发生咱们只能寄宿愿于咱们的装置程序可以有足够的智能来寒暄这所有,这样就不管用户能否抉择了目录。完成方法如下。  
MessageBox ("删除注册表数据失败!", SEVERE);  

CreateFile(nvFileHandle, "c:\\","Autoexec.bat" );  
endif;  
if (nResult = BACK) goto Dlg_SdShowInfoList;  
if (lFreeSpace < 20486860) then  
另外,特地提一下,在Splash Screen下除了Language Independent分支外,还有Chinese(PRC)和English分支,假设在它们中搁置不同的Setup.bmp文件,那么系统会根据用户在装置前抉择了不同的言语而启动不同的背景,这样可能有效地避免多国言语的烦恼。异样,在设置法律申明(答应协定)和自述文件的时分也是一样的。  
NUMBER nType, nSize, nvType, nvSize;  
之前就行了。  
该函数用来查看某个指定的键能否在注册表中。  
Path\win42\dbodbc6.dll  
Function OnBegin()  

因为咱们在生成名目标同时在言语抉择中抉择了Chinese(PRC)和English,因此,在图02中的下拉列表框中会主动出现中文,英国的选项。这一步由模板主动实现,咱们不要做任何事件。  

大家肯定有过这样的教训,每当咱们殚精竭虑为用户开发完一个系统之后往往都是派一名技术员到用户那里停止运用软件的装置,数据库的配置,这些看似简略的配置对普通用户来说可不是件容易做的事。这不只给那些青睐力图完美的程序设计师带来一点遗憾外,而且也使咱们设计进去的软件短少一种平安可靠感。假设咱们在交给用户软件的时分能给他们一个象一些业余软件的装置程序,这不只给用户留下了一个良好的第一印象,同时也节俭了开发维护老本。  
该函数前往指定磁盘或指定门路所在磁盘的剩余空间,用字节示意。  
function OnMoved()  


svDB = TARGETDIR + "\\db\\Demo.db";  
4、 RegDBSetKeyValueEx  
该函数为其余的注册表函数设置一个不同的根键。大少数InstallShield注册表函数任务在缺省的以键HKEY_CLASSES_ROOT为根的注册键树上,用这个函数你就可能指定一个特殊的键为根,像键HKEY_LOCAL_MACHINE或 HKEY_CURRENT_USER或HKEY_USERS。  
// setup default status  
PWD  
SdShowMsg (szMsg, TRUE);  
MessageBox ("装置程序在停止末尾菜单中减少快捷模式失败,稍侯请本人减少!.", SEVERE);  
szMsg = "";  
// 删除末尾菜单中的快捷模式  
STRING svResult;  
除此之外,你还必须在键HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBC Drivers中为Adaptive Server Anywhere注册  
然而,你不能为一个布告板指定显示时间,InstallShield会根据整个程序的装置时间(指文件拷贝时间)主动的为每一个文件平均分配,但至少是2秒。假设你的装置程序仅继续20秒,而你却搁置了26副图片,很显然系统只会显示前20副图片。  
szIconPath, nIcon, szShortCutKey, REPLACE) < 0) then  
在很多情况下,当咱们修正了注册表或是在系统中装置了其它驱动程序的时分,为了确保运用程序可以顺利运转,咱们还是宿愿用户在装置完结之后可以重新启动一下系统。这时函数SdFinishReboot就显得非常有用。  
nSize) < 0) then  
显然,预备任务可能在事情OnFirstUIBefore中实现,但InstallShield同时还为咱们提供了事情OnBegin,该事情在是在Setup脚本中第一个被触发。还记得图片02,上面有个进度条,显示了“正预备InstallShield(R)导游...”,当该进度条完结后就首先调用OnBegin,然后才是OnFirstUIBefore。因此,咱们可能将一些前期的预备任务放到这里来实现。下面是如何详细完成。  
该事情是在当一切在指标机器上的组件都被装置或反装置时照应,在该事情中的代码总是会被执行。  

以下的表列出了 ODBC 桌面数据库驱动程序 4.0 的每一个组件所要求的文件。这些文件装置在 Windows的系统目录\Windows\System或 Windows NT的系统目录\Windows\System42下。假设 ODBC 文件以前被装置在一个不同的目录中,请确定你利用的是在 \Windows\System (或 System42) 目录下的新文件。  
svTemp = szDir;  
STRING svDB;  
szItemName = "My Demo in Desktop";  

if (DeleteFolderIcon (FOLDER_PROGRAMS, "My Demo in Programs") < 0) then  
if (RegDBDeleteValue (szKey, "MyDemo") < 0) then  
if (SYSINFO.WIN0X.bWinMe ||  
szNumValue = svDB;  
szNumName = "Driver";  
begin  
szKey = "Software\\ODBC\\ODBCINST.INI\\MyDemo ASA";  
Msrd2x40.dll,Msrd4x40.dll  
if (AddFolderIcon (szProgramFolder, szItemName, szCommandLine, szWorkingDir,  

Adaptive Server Anywhere Sample Database  
既然咱们知道了如何在注册表中为运用程序停止ODBC配置,那么剩下的成绩是,把他们放在什么中央?不用说,大家也猜到了,最好的中央就是当一切文件都已经复制终了,在咱们要求用户重新启动系统之前。事情OnMoved可能做到这所有。在做这些事的同时咱们最好可以显示给用户一个消息框,告诉用户咱们在干什么,做完这所有之后再封闭它。这就要用到函数SdShowMsg和Delay。见图。  
值类型  
Dbodbc6.dll  
UID  
nSize) < 0) then  
DatabaseFile  
endif;  
nSize) < 0) then  
Path\dbodbc6.dll  
MessageBox ("删除注册表数据失败!", SEVERE);  
2、 HKEY_CURRENT_USER  
//*******退出装置进程中用户所抉择的次要步骤  
endif;  
RegDBSetDefaultRoot (HKEY_LOCAL_MACHINE);  
abort;  
2、ODBC引见  
为了达到上述目标就必须知道:  

Msxbse40.dll,Oddbse42.dll  
那么如何在制造装置程序的时分完成数据库驱动程序的装置和配置呢?要完成它咱们还是先从注册表和ODBC两个基本概念动手,下面停止分别探讨。  
在早期的Windows系列运用程序中用后缀为.ini的文件保存Windows系统和其余该运用程序的配置信息。起初,Windows06的出现,系统就用一个称做注册表的来代替保存运用程序配置信息的.ini文件,虽然Windows06仍然支持利用.ini文件。用注册表来保留这些信息可认为咱们提供一个配置信息的单一源,这不同于那些散布在磁盘里的各种.ini文件的杂烩。同时,注册表也提供了一个简略机制来保存以后用户或以后配置的信息。注册表甚至容许你经过网络治理其余机器的注册表。另外,在NT下,注册表能提供平安级别,这在先前的配置存储机制中是没有的。因此,使得是否正当的利用注册表成为WIN42运用程序的特色之一。  
在该键中添加如下键  
MessageBox ("注册表操作失败,装置程序将终止!", SEVERE);  
就这么简略。申明一下,这里我只是给出的最简略的判断形式,较为平安的形式是在判断时对序列号停止必要的加解密转换,有兴味的冤家可能本人去完成。  
2、 在你的脚本里,首先要确保在文件被传输前调用Enable(BACKGROUND) 和 Enable(FULLWINDOWMODE),咱们可能加在事情OnMoving中。方式如下:  
//*************配置ODBC  
在讲述到数据库配置的一系列成绩是以目前最罕用的ODBC接口为基础,文中用到的实例是在WIN08系统中,InstallShield用的是Professional 6.22下开发和调试的,其中的运用程序实例用的PowerBuilder 8.0下开发的演示程序。  
nResult = SdAskDestPath( szTitle, szMsg, szDir, 0 );  
/*****************程序代码*******************/  
function OnMoved()  
Driver  
svName = "";  
end  
szKey = "Software\\ODBC\\ODBC.INI\\ODBC Data Sources";  
nSize) < 0) then  
endif;  
szNumValue = "Yes";  
该函数从指定的门路或带有门路的文件名当中提取该门路或文件所在的磁盘驱动器号。调用胜利前往0,否则前往小于0的任何数。  
abort;  
endif;  
Odbcjet字符串t  
总结  


OnMoving:该事情在当所抉择的装置组件正在装置或反装置时照应。  
Odbccp42.dll  
szMsg2 = "在利用本软件前必须重新启动。";  
szClass = "";  
nSize) < 0) then  
2、 无关与这些驱动程序一同利用的ODBC版本的信息,参考ODBC程序员参考手册。  
nResult = SdStartCopy( szTitle, szMsg, listStartCopy );  
咱们肯定还记得每当装置一个像Office等业余化软件时,在软件正式装置前系统都会给出一个列表框,其中列出了你所做的所有抉择,包括软件的装置门路,需求装置的组件等,同时还包括了注册的用户名和单位等信息。在咱们用InstallShield制造装置盘的时分也会有这一个列表框,但遗憾的是在缺省状况下InstallShield提供的这个列表框是空的,什么内容也没有,这需求咱们给它退出。好在有函数ListAddString来帮咱们的忙。  
STRING szShortCutKey, szProgram, szParam;  
Start  
Dlg_SdAskDestPath:  
 
在事情OnFirstUIBefore中找到Dlg_SdAskDestPath分支,如下  
ODBC翻译程序  
Msjint40.dll  
RegDBSetDefaultRoot (HKEY_CURRENT_USER);  
Msvcrt40.dll  
szNumValue = "SQL";  
String  
function OnMoved()  
认真的冤家肯定会留意到软件在装置进程中会出现两副不同的背景图片,图22和图24,这就是InstallShield的显示区界面,咱们可能称它为布告板。这看下来是不是很像在播放幻灯片?呵呵,咱们可能和微软的比一比了(说句笑话)。言归正传,还是来说说是如何完成的吧。  
NUMBER nOption, nReserved;  
当咱们用名目导游生成的新名目时,InstallShield只为咱们生成两个事情,分别是OnFirstUIBefore和OnMoving,它们的意义是,  
MessageBox ("装置程序在删除桌面上的快捷模式的时分出错,稍侯请本人删除!.", SEVERE);  
在脚本Setup.rul的事情OnFirstUIBefore中找到Dlg_SdStartCopy分支,如下:  



if ( svSerial != '200822') then  
MessageBox ("注册表操作失败,装置程序将终止!", SEVERE);  
SdShowMsg:该函数关上或封闭一个非模态的小窗口,该窗口显示指定的消息。  
* OpenFile:关上一个已经存在的文本文件或二进制文件。但关上之前必须先要用OpenFileMode设置文件关上的形式。  
String  
该函数为某个在注册表中的键设置键值。假设该键不存在,该函数将为你创建该键。然而,新创建的键不会被装置软件卸载程序所注销,除非它是一个已注销过的键的子键。要想让装置软件卸载程序所注销可能先用RegDBCreateKeyEx创建然后再设置该键值。  
MessageBox ("注册表操作失败,装置程序将终止!", SEVERE);  
szNumValue = "DBA";  
endif;  
注册表利用的是树型体系结构,树中的每个结点称键。每个键也可能蕴含其余的键或子键。它容许进一步的分支,也即为值,它用来存储有效的数据。在注册表中,注册表用键来组织数据,一个键中的值用它们的名来辨认,键名由可能打印的ASCII字符组成的简略字符串。另外,以英国句号(.)末尾的键名被系统所保留。键中的值可能用不同的数据来示意,可能是从一个简略的整数到用户定义的二进制对象。在注册表中只要四个基本键会遭到运用程序装置的影响,这四个键分别是HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE和HKEY_USERS。而其中对咱们配置ODBC有用的只要HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER。  
4、完成内存容量的检测  
... ...  
//eg. ListAddString(listStartCopy,svName,AFTER);  
STRING szNumName, szNumValue, svNumValue, szTitle;  
abort;  
2、 上面的path除了DatabaseFile指的是客户数据库所在的门路,其余的都是指Adaptive Server Anywhere的装置门路。咱们在给客户散发运用软件的时分普通不再另外装置Adaptive Server Anywhere,所以可能将Adaptive Server Anywhere门路下的文件Dbeng6.exe,Dbodbc6.dll,Dblgon6.dll,Dbport6.dll,Dbcon6.dll,Dbodtr6.dll一同散发给客户,并且拷贝至一个单独目录下,然后将门路指向它就可能了。  
/**********************程序代码******************/  
键值  

Setup  
szNumValue = "Installed";  

Odbcjtnw.hlp  
Mspdox40.dll,Odpdx42.dll  
// 删除桌面上的快捷模式  
endif;  
Adaptive Server Anywhere装置程序会主动在NT和WIN0X的系统注册表中标识和配置ODBC驱动程序。因此,假设你为你的最终用户制造运用程序的装置程序时也必须停止相反的设置。  
SYSINFO.WINNT.bWin2000) then  
ListAddString(listStartCopy,"",AFTER);  
MessageBox ("注册表操作失败,装置程序将终止!", SEVERE);  
十二、 第一幅背景,第二幅背景——图片22,图片24  
Odbcjtnw字符串t  
 
if ( FindFile(TARGETDIR + "\\db\\", "Demo.db", svResult) < 0 ) then  
if (nResult = BACK) goto Dlg_SdSelectFolder;  
svASAOdbcDll = TARGETDIR + "\\ASA\\dbodbc6.dll";  
八、 装置文件夹  
HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources\  

前添上相应的序列号校验程序  
endif;  
下列文件是装置某一个驱动程序类型的软件所必须的:  
该函数在指定的程序言件中插入或交流图标。  
String  
PROGRAMFILES:寄存Windows程序言件夹(Program files)的残缺门路。不能更改。  
SetStatusWindow(0, "");  
不过,最后我还是要多说一句,千万不要忘了编写一个具体,残缺的用户手册。这可是用户最需求的,但同时也是咱们最懒得去做的一件事。  
该函数前往无关指标系统的诸如CUP类型,磁盘容量,以后日期,以后操作系统,内存容量等信息,前往的内存容量是以千字节为单位。无关函数的详细利用请参阅函数手册。  
好了,无关注册表的一些知识就简略的说到这里,在末尾末尾配置咱们的ODBC之前,为了便于读者可以顺利的读懂本文所附带的程序代码,现将无关InstallShell注册表函数作一个简略的引见。  
//end.  
该函数弹出一消息窗口,用户经过按是或非来答复该窗口显示的成绩。  

MessageBox ("删除注册表数据失败!", SEVERE);  
好了,运转一下,很不错。咱们可能应用这项技术在装置进程中播放类似幻灯片效果,就像装置Windows一样。  
MessageBox ("装置程序在删除程序言件夹中的快捷模式的时分出错,稍侯请本人删除!.", SEVERE);  
详细实现代码如下:  
endif;  
其中,Software子键用于蕴含用户运用程序的配置信息,这是最有能够被咱们的运用程序利用的中央。因为咱们的运用程序所要的信息普通来说对其余程序并不需求,同时也为了更好的治理这些信息,因此咱们应该在HKEY_LOCAL_MACHINE\SOFTWARE下添加一个子键,键名当然是能代表咱们的运用程序。  
十三、 复制实现  
//SzProgramFolder = FOLDER_STARTMENU;  
endif;  
其中svName、svCompany、szDir等变量咱们可能在事情OnFirstUIBefore末尾的变量定义中找到。从变量的称号咱们很清楚的知道该变量寄存的是用户名,单位,装置目录等。  
2、 该硬盘以后的剩余空间是多少  
相干函数:ListAddString  
Odbctl42.dll  
抉择Setup File面板,关上Language Independent,抉择Operating System Independent ,在右边列表中找到License.txt文件,双击它输入本人的答应协定就行了。  
AutoStop  
好了,战役的号角已经吹响了,让咱们集中精神个个剿灭。  
 
String  
ListAddString(listStartCopy,"",AFTER);  
MessageBox("警告:输入序列号谬误,请确认后重输!",SEVERE);  
 
该语句的性能是在用户抉择的门路后加上单位和运用程序称号作为装置的目录(注:这里我并没有思考到用户在抉择了默许外的门路后加上单位和运用程序称号作为装置目录的情况)。其中,变量COMPANY_NAME 和PRODUCT_NAME中寄存的是单位名和产品名,咱们可能随时在资源面板中修正它的值。  
 
2、完成操作系统的辨认  
LongPathToQuote (szProgram, TRUE);  
Enable(STATUSDLG);  
STRING szProgramFolder, szItemName, szCommandLine, szWorkingDir, szIconPath;  
szKey = "Software\\ODBC\\ODBCINST.INI\\ODBC Drivers";  
2、首先,如何减少OnBegin事情?  
相干函数:SdFinishReboot  

endif;  
Adaptive Server Anywhere 6.0  
LongPathToShortPath (szParam);  
* LongPathToQuote:在长文件名上搁置或去掉双引号。由于假设是没有加引号的长文件名PAHT命令是不会认的。  
// 删除程序言件夹中的快捷模式  
ListAddString(listStartCopy,"用户单位:" + svCompany,AFTER);  
* FindFile:在指定的门路下查找指定的文件,当函数前往0时示意文件找到,以后往小于0的任何数时示意没有找到。  
if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,  
if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,  
OpenFileMode(FILE_MODE_APPEND);  
/*****************程序代码*******************/  

Paradox  
szNumName = "Description";  
MessageBox ("注册表操作失败,装置程序将终止!", SEVERE);  
 
a. 你的最终用户需求创建本人的数据源  
 
abort;  
InstallShield将事情分成三类:全局事情,组件事情和杂项事情。其中,全局事情的减少最为方便,只需将以先行光标移到Serup脚本的最后,然后写上  
布告板,它只要在文件被传输时才被激活。也就是说,当你调用ComponentTransferData函数来解压并拷贝时布告板才被显示,该函数是有系统主动调用,用不着咱们来操心。  

Odbccp42.cpl  
... // 函数体  
2、 在设置文件(Setup Files)面板中,在适合的指标言语和平台下搁置具备特殊后缀名的布告板文件。默许的命名是:“Bbrd”,然后再跟一个数字,最后再加上后缀“.bmp”或“.wmf”。例如,咱们如今要加三副BMP图片,则这三副图片的称号分别应该是Bbrd2.bmp、Bbrd2.bmp、Bbrd4.bmp。  
case CUSTOM: ListAddString(listStartCopy,"装置类型:自定义装置",AFTER);  
ListAddString(listStartCopy,"程序言件夹:" + szfolder,AFTER);  
详细的实现代码如下:  

Mstext40.dll,Odtext42.dll  
在语句  
2、 RegDBSetDefaultRoot  
String  
键名  
endswitch;  

Odbcinst字符串t  
if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,  
endif;  
szDir = szDir^@COMPANY_NAME ^@PRODUCT_NAME;  

RegDBSetDefaultRoot (HKEY_CURRENT_USER);  
szItemName = "My Demo in Programs";  
svCompany = "";  
该函数在字符串列表框的以后对象前后新添加一个字符串。调用胜利前往0,否则前往小于0的任何数。  
Msjet40.dll  
MessageBox ("装置程序在停止程序言件中减少快捷模式失败,稍侯请本人减少!.", SEVERE);  
Dbodtr6.dll  
STRING szKey;  
// 在Autoexec.bat中退出搜寻门路  
在语句  
ListAddString(listStartCopy,"客户信息:",AFTER);  
一、 言语抉择  
szTitle = "";  
Odbc42gt.dll  
szNumName = "DatabaseFile";  
该函数显示一个重新启动的对话框,它提供给用户两种抉择:系统主动启动和用户本人启动。当函数前往WILL_REBOOT表明用户抉择了重新启动;以后往NEXT(或2)表明用户抉择了本人启动;以后往小于0表明当用户抉择了重新启动,但重新启动失败。在缺省的情况下是用户本人启动。  
为了利用ODBC驱动程序装置程序不只仅只是将这些驱动程序言件拷贝到硬盘上,它还必须在注册表中设置一组ODBC驱动程序的属性。  
一、注册表  
 
szKey = "Software\\ODBC\\ODBC.INI\\MyDemo";  

/*************** 完结 ***************/  
/****************** 完结 ******************/  

if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,  
前加上如下代码  
// 在末尾菜单中减少快捷模式  
LongPathToQuote (svDir , TRUE );  
szMsg = "";  
szShortCutKey = "";  
Delay:该函数可能用指定的时间(秒)来使装置程序的执行时间提前。  
Odbcjt42.dll  

相干函数:  
NUMBER nIcon;  
endif;  
该步骤是由InstallShield主动给出的,普通情况下咱们不必做任何事。三个装置选项:典型装置、紧缩装置和自定义装置是根据咱们在装置类型(Setup Type)的面板中预先设置好的值来停止的。假设用户抉择了自定义装置,系统就会弹出如下界面,见图。  
这一步由InstallShield主动给出。  
Odbcjet.hlp  
七、 序列号判别  
String  
//*******退出磁盘剩余空间判别,目前判别剩余空间能否少于20M  
经过查看Windows注册表工具,咱们发现Adaptive Server Anywhere的ODBC驱动程序是在下列的键中被系统所标识的。  
endif;  
触及到的函数:  

// 建设MyDemo ASA下的键值  
szNumValue = "MyDemo ASA";  
用InstallShield装置模板制造出的装置程序在运转进程假设没有序列号是无奈再持续上来的。但假设咱们在序列号上不加任何检验的话,InstallShield会默以为任何字符都是有效的而不管它是什么,此时序列号也就毫有意义,除非你想让你的运用程序无限度的公布。因此,还是建议你在装置进程中对序列号停止一下有效性检验。方法很简略,在事情OnFirstUIBefore中找到Dlg_SdRegisterUserEx分支,见下列代码:  
下表列出的是任务在Adaptive Server Anywehre环境下的驱动程序,必须将这些文件拷贝到一个独立的目录下,并且使系统可以搜寻到。  
endif;  
文本文件:减少形式,只读形式  
szMsg = "正在停止系统配置,请期待...";  

* WriteLine:该函数在一个以减少形式(append mode)关上或建设的文本文件中写上一行文本。  
 
Microsoft Excel  

Msexcl40.dll,Odexl42.dll  
nType = REGDB_STRING;  
首先,咱们可能来快速体验一下用InstallShield制造的装置程序是什么样的。  
abort;  
NUMBER nvFileHandle;  
szMsg = "揭示:该软件只能运转在Intel系列的解决器上!\n\n装置程序将终止";  
szTitle = "";  
CloseFile(nvFileHandle);  
szMsg = "该软件只能装置在26M以上内存的机器中。\n很遗憾,本机器可用内存无余26M!\n\n装置程序将终止!";  
endif;  
键名  
 


相干变量:SYSINFO  
2、ODBC 4.0驱动程序  
在咱们生成名目标同时,InstallShield会为咱们缺省的放上一张启动画面。见图26。  
这一步由系统主动给出,咱们不要做任何事件。然而咱们可能在这里停止软件装置前的预备任务。比如,操作系统判别,机器可用内存容量的检测等,这些往往被漠视。  
MessageBox ("注册表操作失败,装置程序将终止!", SEVERE);  
 
nType = REGDB_STRING;  

nSize) < 0) then  
endif;  
SHELL_OBJECT_FOLDER = @FOLDER_NAME;  
类型  
szDir = TARGETDIR;  
 
以下的文件对于每一个 ODBC 桌面数据库驱动程序 4.0 是共同的:  

STRING svDir;  
OpenFile ( nvFileHandle , "C:\\" , "Autoexec.bat" );  
// 在程序言件夹中减少快捷模式  
// Set up parameters for call to AddFolderIcon.  
b. 当用户衔接数据库时需求输入用户标识和口令  
nSize) < 0) then  

在普通情况下,InstallShield默许的装置文件夹是寄存Windows程序言件夹(Program files)的残缺门路,即C:\ Program files(假设Windows装置在C盘的话)。然而,在绝大少数情况下咱们都宿愿客户将运用程序装置在单独的数据盘上,即不与操作系统装置在同一个硬盘分区里。一方面便于治理,另一方面也为了防止咱们的程序由于系统盘格局化而遭到牵累。因此,咱们经常会建议用户在装置运用程序的时分抉择另一个硬盘,如D盘。  
endif;  
if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,  
begin  
endif;  
if (nResult = BACK) goto Dlg_SdRegisterUserEx;  

abort;  
end;  
Microsoft Access  
STRING svResult;  
假设咱们没有给svName和svCompany赋新值的话缺省的用户名和客户称号就是咱们在装置Windows时注册的用户和单位。当然,假设没有给svSerial赋值的话,图片上的序列号就为空。  
WriteLine( nvFileHandle ,"Set PATH=" +svDir +";%PATH%");  
STRING szAppPath;  
Enable(BACKGROUND) :显示装置主背景窗口  
首先,用Project Wizard建设一个新的名目,取名Demo,同时在对话框中抉择一切的选项,并且在言语抉择中抉择Chinese(PRC)和English,即简体中文和英国支持。当然你也可能抉择其它言语,为了便于探讨我只抉择了Chinese(PRC)和English。  

szMsg = "";  

六、客户信息  
PlaceWindow(STATUSDLG, 400, 20, LOWER_LEFT);  

nSize) < 0) then  
SYSINFO.WINNT.bWinNT ||  
Odbc42.dll  
运转一下试一试,所有都失常,只是一个空壳罢了,没有任何货色。  
abort;  
二进制文件:只读形式,读写形式  
/*****************重启动代码*******************/  
ListDestroy(listStartCopy);  
五、 Readme文件  

szNumName = "Setup";  
留意:  
if (DeleteFolderIcon (FOLDER_DESKTOP, "My Demo in Desktop") < 0) then  

相干系统变量:  
RegDBSetItem(REGDB_APPPATH, szAppPath);  
三、 末尾装置  
szNumName = "MyDemo";  

szProgramFolder = FOLDER_PROGRAMS;  
abort;  

函数二:GetDiskSpace  
寄存本机的一些系统变量,如操作系统,CUP类型等。无关系统变量的详细利用请参阅编程手册。  
详细实现代码如下:  
InstallShield之所以很盛行兴许是由于程序员可能在经过编写脚本言语方便的停止Windows运用程序的注册表修正、ODBC配置等简单的操作,以及她自身提供了一些相当智能化的性能。下面,就自己在实践开发中的一些所得和大家一同讨论,文中如有任何不妥之处还请同行们给予指教。  
endif;  

StatusUpdate(ON, 200);  
szMsg2 = '请抉择一种启动模式,然后单击"确定"实现装置。';  
abort;  
十一、 最后确认  
Text  
HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\Adaptive Server Anywhere 6.0,其中需求设置的下键有  
Expsrv.dll  
szNumValue = svASA + " -d -c8m";  
if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue,  
留意:  
4、Adaptive Server Anywehre ODBC驱动程序  
if (RegDBDeleteKey (szKey) < 0) then  
endif;  
假设说咱们实现了图2到图26全副性能后就可能马上入手制造装置盘的话那咱们所做的也只是给运用程序加了一个花边,并没有实践效用。它只是把原先由人工的复制任务交给系统主动去执行,更说不上文章扫尾所说的完成系统的主动配置。咱们还是得在运用程序发行时去用户现场装置、配置一些接口程序。  

end;  
这是由系统主动给出的,咱们用不着写一行代码,这是不是很棒?  
String  
6、数据源注册  
 

szTitle = "";  
下面是残缺的ODBC注册表配置的代码程序。  
形容  
//******* 20M * 2024千字节 * 2024字节 = 20486860 字节  
goto Dlg_SdRegisterUserEx;  
MessageBox ("重启动失败,请重新启动系统后再利用本软件!", SEVERE);  
// 在桌面上减少快捷模式  
Yes  
nReserved = 0;  
function OnEnd()  
从该图片上咱们可能看出,普通情况下是搁置一张能很好的代表你公司的图片,同时上面很清楚地标明你的运用程序的称号,版本,公司称号,版权归属等基本信息。毫无疑难,咱们必须用咱们本人的图片来交流它。交流的方法是,在Setup File面板中,关上Splast Screen,找到Language Independent,这时咱们会发如今它右边的列表中有一个文件Setup.bmp,它就是图28的那一张,咱们必须首先把它删除,然后再插入咱们想要的那一张,在列表中任何一个地位点击鼠标右键,抉择Insert Files,用一个BMP文件交流它就行了。留意,咱们交流的图片的文件名必须是Setup.bmp。  
// UInstalled -- end  
Dlg_SdStartCopy:  

当然了,咱们还得在卸载程序中加上删除这些快捷模式的代码,否则的话当用户删除了咱们的运用程序后会对咱们的程序勃然大怒的,我当然不宿愿这样。  
endif;  
相干函数:AddFolderIcon  
return 0;  
szProgramFolder = FOLDER_STARTMENU;  
szNumName = "MyDemo ASA";  
endif;  
Installed  
Begin  
//*******添加序列号的检验  
abort;  
ListAddString(listStartCopy,"",AFTER);  
MessageBox ("装置程序在删除末尾菜单中的快捷模式的时分出错,稍侯请本人删除!.", SEVERE);  
该键中寄存的是每一个数据源和ODBC驱动程序的关联。键名是指数据源名字;键值是指ODBC驱动程序的名字。因为本文所叙说的是基于PowerBuilder8.0开发环境下的运用程序的公布,所以键值都是"Adaptive Server Anywhere 6.0"(由于,当咱们装置PowerBuilder 8.0时,系统默许的ODBC驱动程序的名字为Adaptive Server Anywhere 6.0),当然,假设你情愿话也可能扭转它。  

Odbcint.dll  
Ds42gt.dll  
szItemName = "My Demo in StartMenu";  
驱动程序  
同上,找到Infolist.txt文件,双击它输入需求阐明的自述文件。  
DBASE  
键值  
第一步:快速体验  
szAppPath = TARGETDIR;  
键值  
网络接口文件  
/******************完结*********************/  
咱们只需将这段代码放入语句  
然后,将语句  
String  

/**************** 完结 *******************/  
MessageBox ("注册表操作失败,装置程序将终止!", SEVERE);