您所在的位置: 程序员家园 -> 家园博客 ->
 
在哪里摔倒
就在哪里自己爬起来

用户登录

查  找

最新评论

最新留言

常用网站

网易邮箱 GMAIL  

百度搜索 MSDN

霏凡软件 BT精品

影视帝国 射 手 网

电驴下载 全 库 网

友情连接

茄菲的窝 冰冰博客

枫叶飘零 玫  瑰

ACEN 云 豹 子

统  计



用installshield打包时在注册表里注册项和键值 
狼子 发表于 2006-9-19 16:35:00 阅读全文 | 回复(0) | 引用通告 | 编辑  installshield查看本站使用过本标签的日志查看本站使用过本标签的用户

installshield里注册表的函数,6.x版本,在CSDN2003年发表的《InstallShield内部库函数全集中文版》里记录了22个,我是从这里面学习的,这个函数全集我打包发在这里:http://www.tiantiansoft.com/bbs/dispbbs.asp?BoardID=3&id=138942

在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

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

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

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

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

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

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

先记录这个帖子:http://www.tiantiansoft.com/bbs/dispbbs.asp?boardID=3&ID=74946

这个帖子记录了我学习注册表函数的一些过程,还有installshield群里的这两句话:

李木勺 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

发表评论:

    昵称:
    密码:
    主页:
    标题:
Powered by Oblog.