我在这里要记录的是打包的时候注册表的问题,注册表分项和键,打开注册表(开始->运行,输入regedit,确定),可以在左边的树形里看见很多文件夹的图标,这些是项,点击一个项,可以在右边看见他的键值,每个项都有一个“默认”,有的项还有很多键值
在打包的时候,我们有时候要记录很多东西,嗯,我们要记录安装文件的类型(服务器端程序还是客户端程序),我们要记录软件的注册类型(测试版本还是已经注册的软件),我们要记录软件的安装路径(这样我们升级软件的时候,我们的补丁程序可以自己copy到安装路径下),我们想记录的很多东西,我们经常喜欢用注册表,这里我讲两种注册方法
一、要注册的项和键值是静态的
静态的意思是要注册的所有项和键,他们的值在制作安装包的时候就知道的,我们可以直接在is的Registry面板里设置
我假设我要建一个项:HKEY_LOCAL_MACHINE\\SOFTWARE\\NNLLTEST,在NNLLTEST下有两个string value的键:install(记录安装路径)、soft(记录这个软件是测试版,值是0)
步骤是这个:
1、点击Registry面板,展开Default,可以看见五个根,这五个根是固定的,不变的
2、选中HKEY_LOCAL_MACHINE,右击,选菜单new->Key,新建一个项“New Key #1”,修改名字是“SOFTWARE”
3、选中SOFTWARE,右击,选菜单new->Key,新建一个项“New Key #1”,修改名字是“NNLLTEST”
这样就建好一个项HKEY_LOCAL_MACHINE\\SOFTWARE\\NNLLTEST了,下面建健值
4、选中NNLLTEST,右击,选菜单new->string value,新建一个键“New Value #1”,修改名字是“install”,这样就建了一个键,双击这个键值,在“value data”文本框里输入:<TARGETDIR>
<TARGETDIR>在is里是代表安装路径的
5、重复第4步,修改名字是“soft”,输入“value data”是:0
这样就建好了如图的注册表
安装文件在安装后,也会按这里的设置自动在注册表里生成的,这里生成的注册表项和键值,在卸载时会同时卸载
上面一共是五步,也可以直接在自己的注册表里加上键值后,导出reg文件,Registry面板里使用导入菜单导入,在11.5里,Registry面板里,分了四块,左上角是自己的注册表,也可以直接把自己的注册表,copy到左下角的安装包的注册表里
二、要注册的项和键值是动态的
动态的意思是要注册的项和键,他们的值是不知道的,是在用户安装的时候,由用户的选择和输入的值确定的,这时候我们要用注册表函数在脚本里注册
我不想说注册表函数,我学得不多,想学习下载《InstallShield内部库函数全集中文版》,我这里记录下我学习的时候用到的一些东西
语法:RegDBGetKeyValueEx (szKey, szName, nvType, svValue, nvSize);
说明:RegDBGetKeyValueEx函数检索注册表中一个指定项下一个特定数值名的值。缺省时,InstallShield假定该项是HKEY_CLASSES_ROOT下的一个子项。你可以用RegDBSetDefaultRoot来指定另一个开关键。RegDBGetKeyValueEx是一个通用注册表相关函数,设计为可工作于所有注册表项,包括那些由特殊注册表相关函数处理的项。
参数: szKey指定其值要被检索的项的名称。用一个双反斜杠来分隔子项中的不同层。 szName指定在szKey下其值要被检索的数值的数值名。要检索项的缺省值,则传递一个空字符串。 nvType返回下列预定义常量之一,它们标识在svValue返回的数据的类型:请参阅15.12中该部分的说明。 svValue返回由szKey和svName 指定的值。注意一个数值型值以一个字符串返回。 nvSize以字节数返回在svValue返回的值的大小。
返回值: 0:表明函数成功检索该值。 < 0:表明函数未能检索该值。
红色那里,“项”是指在注册表里,左边的用文件夹的图片显示的那些吗?那“数据值”是没是指注册表中右边显示的那个“名称、类型、数据”列表里的名称呢?
试了好几种调用都出错了,究竟这几个词,对应的是注册表里的嘛啊?
答:
这两句话教会了我RegDBSetKeyVAlueEx是怎么用的
1、用InstallationInfo创建的项,用RegDBSetItem创建的键值
InstallationInfo创建的项是一定在HKEY_LOCAL_MACHINE]\Software \Microsoft\Windows\CurrentVersion\App Paths下的,函数是这个
这样注册的注册表,在卸栽的时候是同时卸栽的
2、使用RegDBSetKeyValueEx在指定的路径注册项和键值
我假设我要建一个项:HKEY_LOCAL_MACHINE\\SOFTWARE\\NNLLTEST,在NNLLTEST下有两个string value的键:cona(记录公司名)、sc(记录这个软件是客户端程序还是服务器端程序)
①获取公司名和用户名的对话框一般是is自动生成的
②在OnFirstUIBefore函数里,加入让用户选择对话框,让用户确定是安装服务器端程序还是客户端程序
//NNLL加入判断,安装的是服务器还是工作站
SelectType:
szMsg="请选择安装的计算机用于:" ;
bvCheck1 = TRUE;
bvCheck2 = FALSE;
bvType = TRUE;
nResult = AskOptions ( EXCLUSIVE , szMsg , "服务器" , bvCheck1 , "工作站" , bvCheck2 );
if (nResult = BACK) goto Dlg_SdLicense2;
if bvCheck2 = TRUE then
//工作站,注册表项server=0
bvType = FALSE;
else
//服务器,注册表项server=1
bvType = TRUE;
endif;
//NNLL修改完毕
哦,我忘了说了,szCompany和bvType两个变量要设置成全局变量
③添加注册表函数
④调用这个自定义函数,在安装结束的时候在注册表生成项和键值
这样注册的项和键值,在卸载的时候,项和键是保留的,动态的值会被删除,静态的值会保留,重新安装的时候,值会被更新
我最后要说的是RegDBSetKeyValueEx函数,因为在《InstallShield内部库函数全集中文版》里有一句话
我的阅读能力很差,所以我一直设置SzName="",所以我一直注册不到键值,我在注册子项,上面我记录的李木勺的两句话,就是这两句话,我想到这个
如果szNumName="",建的是子项,szKey,默认值是szNumValue
如果szNumName="键的名字",建的是szKey下面的键值,默认值是szNumValue
在is的帮助里,有这样的例子:
// Create a key to test.
szKey = "TestKey";
if (RegDBCreateKeyEx (szKey, "") < 0) then
MessageBox ("RegDBCreateKeyEx failed.", SEVERE);
abort;
endif;
// Set up parameters for call to RegDBSetKeyValueEx.
szNumName = "TestValue";
szNumValue = "12345";
nType = REGDB_NUMBER;
nSize = -1;
// Set a key name and a value associated with it.
if (RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue, nSize) < 0) then
MessageBox ("RegDBSetKeyValueEx failed.", SEVERE);
abort;
else
// Display what RegDBSetKeyValueEx has done.
szMsg = "%s set to: %s";
SprintfBox (INFORMATION, TITLE, szMsg, szNumName, szNumValue);
endif;
如果我在上个星期按F1的时候,我看了这个例子,我也会想到要怎么用,我没有看,因为我以为我有《InstallShield内部库函数全集中文版》
最好的帮助是F1