用installshield打包时在注册表里注册项和键值的动态设定方法

在11.5版本里,注册表的函数变化不多

我在这里要记录的是打包的时候注册表的问题,注册表分项和键,打开注册表(开始->运行,输入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

这样就建好了如图的注册表

用installshield打包时在注册表里注册项和键值的动态设定方法

安装文件在安装后,也会按这里的设置自动在注册表里生成的,这里生成的注册表项和键值,在卸载时会同时卸载

上面一共是五步,也可以直接在自己的注册表里加上键值后,导出reg文件,Registry面板里使用导入菜单导入,在11.5里,Registry面板里,分了四块,左上角是自己的注册表,也可以直接把自己的注册表,copy到左下角的安装包的注册表里

二、要注册的项和键值是动态的

动态的意思是要注册的项和键,他们的值是不知道的,是在用户安装的时候,由用户的选择和输入的值确定的,这时候我们要用注册表函数在脚本里注册

我不想说注册表函数,我学得不多,想学习下载《InstallShield内部库函数全集中文版》,我这里记录下我学习的时候用到的一些东西

我的一篇帖子
问:请教RegDBGetKeyValueEx 用法:

语法: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:表明函数未能检索该值。

红色那里,“项”是指在注册表里,左边的用文件夹的图片显示的那些吗?那“数据值”是没是指注册表中右边显示的那个“名称、类型、数据”列表里的名称呢?

试了好几种调用都出错了,究竟这几个词,对应的是注册表里的嘛啊?

答:

李木勺 15:09:01
RegDBSetKeyVAlueEx(szKeyRoot,"path",REGDB_STRING,INSTALLDIR,-1);
李木勺 15:15:07
szKey="SOFTWARE\\NNLLTEST";这是你创建的项。
你却往这个地方写值:
SOFTWARE\\NNLLTEST\\cona

这两句话教会了我RegDBSetKeyVAlueEx是怎么用的

1、用InstallationInfo创建的项,用RegDBSetItem创建的键值
InstallationInfo创建的项是一定在HKEY_LOCAL_MACHINE]\Software \Microsoft\Windows\CurrentVersion\App Paths下的,函数是这个

function NnllReg()
number nItem;
string szCompany,szProduct, szVersion, szProductKey, szValue;
begin
//修改注册表
//在在HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\下
//创建了一个项:NNLL想添加键
//两个键:默认和Path
//反安装可卸裁
szCompany="公司名";
szProduct="软件名";
szVersion="1.0";
szProductKey=" \\NNLL想添加键";
if (InstallationInfo (szCompany, szProduct, szVersion, szProductKey) < 0) then
MessageBox("添加项出错",SEVERE);
else
//添加这个项下的键值
//默认
nItem=REGDB_APPPATH_DEFAULT;
szValue=TARGETDIR + " \\default";
RegDBSetItem (nItem, szValue);
//Path
nItem=REGDB_APPPATH;
szValue=TARGETDIR;
RegDBSetItem (nItem, szValue);
endif;
end;

这样注册的注册表,在卸栽的时候是同时卸栽的

2、使用RegDBSetKeyValueEx在指定的路径注册项和键值

我假设我要建一个项:HKEY_LOCAL_MACHINE\\SOFTWARE\\NNLLTEST,在NNLLTEST下有两个string value的键:cona(记录公司名)、sc(记录这个软件是客户端程序还是服务器端程序)

①获取公司名和用户名的对话框一般是is自动生成的

Dlg_SdRegisterUser:
szMsg = "";
szTitle = "";
//{{IS_SCRIPT_TAG(Dlg_SdRegisterUser)
nResult = SdRegisterUser( szTitle, szMsg, szName, szCompany );
//}}IS_SCRIPT_TAG(Dlg_SdRegisterUser)
if (nResult = BACK) goto Dlg_SdLicense2;

②在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两个变量要设置成全局变量

③添加注册表函数

function NnllReg()
number nRootKey,nType,nSize;
string szKey,szNumName,szNumValue,szClass;
begin
//修改注册表
nRootKey = HKEY_LOCAL_MACHINE;
RegDBSetDefaultRoot (nRootKey);//置根为nRootKey
//注册子项
szKey="SOFTWARE\\NNLLTEST\\";
if RegDBKeyExist(szKey) < 0 then
//不存在“SOFTWARE\\NNLLTEST”,创建这个项
RegDBCreateKeyEx(szKey,"");
endif;
//初始化每个键的公共值
nType=REGDB_STRING;
nSize=-1;
//注册安装路径
szNumName="install";
szNumValue=TARGETDIR;
RegDBSetKeyValueEx(szKey,szNumName,nType,szNumValue,nSize);
//设置为未注册版本
szNumName="soft";
szNumValue="0";
if RegDBKeyExist(szKey) < 0 then
//如果不存在这个项,就注册,如果存在,就跳过
RegDBSetKeyValueEx(szKey,szNumName,nType,szNumValue,nSize);
RegDBCreateKeyEx (szKey, szClass);
endif;
//注册公司名
szNumName="cona";
szNumValue=szCompany;
RegDBSetKeyValueEx(szKey,szNumName,nType,szNumValue,nSize);
//注册程序类型
szNumName="sc";
if bvType then
szNumValue="S";
else
szNumValue="C";
endif;
RegDBSetKeyValueEx(szKey,szNumName,nType,szNumValue,nSize);
end;

④调用这个自定义函数,在安装结束的时候在注册表生成项和键值

prototype NnllReg();//声明函数
function OnEnd()
begin
//修改注册表
NnllReg();
end;

这样注册的项和键值,在卸载的时候,项和键是保留的,动态的值会被删除,静态的值会保留,重新安装的时候,值会被更新

我最后要说的是RegDBSetKeyValueEx函数,因为在《InstallShield内部库函数全集中文版》里有一句话

szName指定要被设置的数值数的数值名。为设置在szKey指定的项的缺省值,给该参数传递一个空字符串。

我的阅读能力很差,所以我一直设置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

你可能感兴趣的:(windows,软件测试,prototype,Microsoft,脚本)