标签 InstallShield 下的文章

InstallScript注册表WOW64重定向

Windows 64位系统兼容32位的技术叫Wow64。windows下面的syswow64为system32的32位模式的位置。注册表HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node模拟HKEY_LOCAL_MACHINE\SOFTWARE的32位模式。

32位的InstallShield程序默认开启了32位重定向。如果需要关闭文件的重定向需要在代码前后加入以下两句:

Disable(WOW64FSREDIRECTION);//关闭64 bit redirection
...//copying files to system32 directory
Enable(WOW64FSREDIRECTION);//重新打开64 bit redirection

注册表设置重定向则有所不同。需要设置一个InstallScript全局常量[REGDB_OPTIONS][2]

REGDB_OPTIONS = REGDB_OPTIONS | REGDB_OPTION_WOW64_64KEY;//禁用注册表重定向

REGDB_OPTIONS = REGDB_OPTIONS & ~REGDB_OPTION_WOW64_64KEY;//重新打开注册表重定向

Error -6118: The Resource compiler failed to build the specified RES file required to link the DLL.

用InstallShield创建了一个InstallScript项目,代码完成后编译报错:

Error -6118: The Resource compiler failed to build the specified RES file required to link the DLL.

Error -6118: The Resource compiler failed to build the specified RES file required to link the DLL.

点击错误码-6118进入Acresso官网知识库,是一个以-6118为关键字的搜索页面。点击看了几篇KB。说是可能是对话框资源(文字)有两点(..)造成的。还有可能是对话框上面的图片损坏造成。不过我这里的情况是找不到一个ico位图。

进入Dialogs,我编辑了对话框SdAskDestPath2 这个对话框有一个文件夹图标,名字叫IconId_10006.ico。到InstallShield安装目录找到这个图片,然后放到项目目录即可编译通过。

read and write REGDB_BINARY registry data using InstallScript

Writing binary registry data using InstallScript is bit of tricky. below is the example of read and write binary registry data:

function FooBar()
STRING svBin,svHex[8];
NUMBER nType,nRet,nLen;
begin
    //get binary data
    nType = REGDB_BINARY;
    nRet =  RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
    nRet = RegDBGetKeyValueEx("SOFTWARE\\tunps.com\\Setting", "ProductName", nType, strBin, nLen);
    //write binary data
    nLen= 8;
    RegDBSetKeyValueEx("SOFTWARE\\tunps.com\\Setting", "ProductName1", nType, strBin, nLen);
    //write binary data using STRING array
    svHex[0] = 0x1F;
    svHex[1] = 0x2E;
    svHex[2] = oxAC;
    ......
    svHex[7] = oxBB;
    RegDBSetKeyValueEx("SOFTWARE\\tunps.com\\Setting", "ProductName2", nType, svHex, nLen);
end;

Binary data is stored in STRING data type. There is not need to specify nLen value for RegDBGetKeyValueEx. Because InstallShield automatically did it for you. but for writing binary registry data, you must specify the length of binary data as InstallShield Language reference for function RegDBSetKeyValueEx has mentioned that:

RegDBSetKeyValueEx ( szKey, szName, nType, szValue, nSize );

nSize Specifies the size—in bytes—of the data to be set. You can specify -1 in this parameter when nType is REGDB_STRING, REGDB_STRING_EXPAND, or REGDB_NUMBER, and InstallShield will set the size. However, with REGDB_BINARY and REGDB_STRING_MULTI, you must always specify the number of bytes of binary data that you are storing. There are two ways to write binary. 

1.STRING

2.STRING array.

Reference:

[1] Q105322: CODE: Setting the REGDB_BINARY Data Using Script

[2] RegDBSetKeyValueEx - InstallScript Language Reference

安裝程式使用函數 WaitOnDialog 在 Script 中偵測到一個可能的死循環。確保使用正確的方法來處理錯誤返回代碼。 錯誤 440。

installscript的如下代码:

nResult = EzDefineDialog ( "SdFinish21" , ISUSER , "" , 22032 );

造成如下错误:


安裝程式使用函數 WaitOnDialog 在 Script 中偵測到一個可能的死循環。確保使用正確的方法來處理錯誤返回代碼。 錯誤 440。

 EzDefineDialog是用来定义一个自定义对话框。原型:

EzDefineDialog ( szDialogName, szDLLName, szDialogID, nDialogID ); 

其中szDialogID指定对话框名字。nDialogID指定ID。如果szDialogID为空(""),就根据ID来查找。

但是我重新生成了InstallShield里面的Dialog。造成生成的nDialogID和以前代码的ID(22032)不一致。导致找不到对话框资源。解决办法是把ID修改为生成的Dialog所对应的nDialogID。

小技巧:nDialogID可以通过Direct Editor -> Dialog 里面的ISResourceId字段获取。

installscript silent install

installshield支持静默安装的安装包类型有installscript、basic msi、installscript msi。

首先编译生成的安装包setup.exe 运行加上参数 -r  进入record mode,手动将软件安装好之后,系统会生成一个应答文件(response file)路径:C:\Windows\setup.iss。setup.iss是一个记录刚才安装用户对于每个对话框的点击和输入变量(比如一些edit box、checkbox)的文本文件。

关于setup.exe的参数解释参见http://kb.flexerasoftware.com/doc/Helpnet/installshield12helplib/IHelpSetup_EXECmdLine.htm

手动卸载软件后,将setup.iss复制到setup.exe同目录下。接下来运行setup.exe -s -f1""。f1参数指定iss绝对路径。我测试setup.exe和setup.iss在同目录的情况不加f1也可以。不过千万别用相对路径。

静默安装过程中没有界面。如果安装过程中出现错误,会在setup.exe同目录下生成setup.log:

[InstallShield Silent]
Version=v7.00
File=Log File
[ResponseResult]
ResultCode=0
[Application]
Name=xxsoftware
Version=8.00.0000
Company=xx
Lang=0009

ResultCode是返回的错误代码,0表示成功,具体参见“Checking for Errors Using the Setup.log File”。

关于静默安装方法的文档:http://kb.flexerasoftware.com/doc/Helpnet/installshield12helplib/InstallShieldSilent.htm