帮朋友做一个安装盘,需要往注册表里面写东东,使用了一下InstallShield的注册表操作,感觉还是满强大的
首先,我要设置一下操作的注册表项都在哪个目录下,比如都在HKEY_LOCAL_MACHINE下,那我就调用下面这句话,注意,这句话一定要在所有读写注册表项之前进行,并且只调用一次即可:
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
然后,我要检查一下我要操作的注册表项存不存在,我可以调用这样一句话:
RegDBKeyExist (regDbKey)
这个方法返回值为0表示regDbKey在注册表中存在,返回值<0表示不存在。
如果不存在的话,我要创建这个项并在其中写入一下名字为Sanc的字段,并赋以初值,那么我调用这句话就行了:
RegDBSetKeyValueEx(regDbKey, "Sanc", REGDB_STRING, "10", -1)
因为我写入的是字符串值"10",所以最后一个参数为-1就可以了,如果我写入的是一个整型值或其它数值型值的话最后一个参数就要说明这个值的长短。
需要注意的是,如果相应的注册表项不存在的话这个方法会自动在注册表中创建相应的项,不用显式的调用RegDBCreateKeyEx (regDbKey, "")了。不过通用RegDBSetKeyValueEx创建的项要是想在卸载时自动卸掉的话,就必须在InstallShield IDE的Registry中注册这个项。
同样,要是更新值的话也是用这个方法。
这个方法如果返回0的话表示成功,返回<0的值表示失败(好像InstallShield的N多方法都是这样
)
那么,如何获取一个值呢?用下面的方法就可以:
RegDBGetKeyValueEx(regDbKey, "Sanc", regType, regValue, regSize)
注意,这个方法中后3个参数都是输出参数,regTyep表示类型,regValue表示值,regSize表示大小,返回值的含义同样遵守上面的法则。
最后还有一点十分重要的
,就是当你的程序中途退出时,不要调用abort方法,而要调用exit方法,要不前面所做的一切注册表操作都将化为乌有。原因是abort操作会执行Uninstall操作,删除前面有注册表中创建的值
.
-------------------------------------------------------------------------------------------------
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
:表明函数未能检索该值。
注解:
一个Windows NT平台上,当检索REGDB_STRING_MULTI数据类型时,带空字符串为参数调用StrGetTokens来将多个以空字符串为中止的字符串分析到一个字符串列表。也就是,如果svValue在调用RegDBGetKeyValueEx后有多个结果字符串,StrGetTokens( listID, svValue,
""
)可以被使用来分析字符串并把它们放到一个由listID指向的字符串列表。
function
OnFirstUIAfter()
STRING
szTitle, szMsg1, szMsg2, szOption1, szOption2,svValue;
NUMBER bOpt1, bOpt2,nvSize,nvType;
begin
nvType
=
REGDB_STRING;
//
SdShowMsg(
"
\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\InstallShield_{5F0F1795-20A4-4DB2-9163-8166B9A6297F}
"
,
TRUE
);
//
Delay(
1
);
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
//
RegDBSetKeyValueEx(
"
\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\InstallShield_{5F0F1795-20A4-4DB2-9163-8166B9A6297F}
"
,
"
UninstallString
"
,REGDB_STRING,INSTALLDIR
^
"
Elane.installer.UnInstaller.exe
"
,
-
1
);
RegDBGetKeyValueEx(
"
\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\InstallShield_{5F0F1795-20A4-4DB2-9163-8166B9A6297F}
"
,
"
UninstallString
"
,nvType,svValue,nvSize);
SdShowMsg(svValue,
TRUE
);
Delay(
20
);
//
SdShowMsg(
""
,
FALSE
);
Disable(STATUSEX);
bOpt1
=
FALSE
;
bOpt2
=
FALSE
;
szMsg1
=
SdLoadString(IFX_SDFINISH_MSG1);
SdFinishEx(szTitle, szMsg1, szMsg2, szOption1, szOption2, bOpt1, bOpt2);
end
;