我的IS笔记--比较乱

1、win7 vista解决安装在C盘不能卸载干净的方法,赋予权限:

Windows Registry Editor Version 5.00

  [HKEY_CLASSES_ROOT\*\shell\runas]

  @="管理员取得所有权"

  "NoWorkingDirectory"=""

  [HKEY_CLASSES_ROOT\*\shell\runas\command]

  @="cmd.exe /c takeown /f \"%1\" && icacls \"%1\" /grant administrators:F"

  "IsolatedCommand"="cmd.exe /c takeown /f \"%1\" && icacls \"%1\" /grant administrators:F"

  [HKEY_CLASSES_ROOT\exefile\shell\runas2]

  @="管理员取得所有权"

  "NoWorkingDirectory"=""

  [HKEY_CLASSES_ROOT\exefile\shell\runas2\command]

  @="cmd.exe /c takeown /f \"%1\" && icacls \"%1\" /grant administrators:F"

  "IsolatedCommand"="cmd.exe /c takeown /f \"%1\" && icacls \"%1\" /grant administrators:F"

  [HKEY_CLASSES_ROOT\Directory\shell\runas]

  @="管理员取得所有权"

  "NoWorkingDirectory"=""

  [HKEY_CLASSES_ROOT\Directory\shell\runas\command]

  @="cmd.exe /c takeown /f \"%1\" /r /d y && icacls \"%1\" /grant administrators:F /t"

  "IsolatedCommand"="cmd.exe /c takeown /f \"%1\" /r /d y && icacls \"%1\" /grant administrators:F /t"

存成XX.reg  然后运行  再装了试试
如果可以就自己按照这个用IS写注册表

2、64位注册表的问题:
REGDB_OPTION_WOW64_64KEY
这是32位下的代码:
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);  

    if (RegDBKeyExist ("SOFTWARE\\Apache Software Foundation\\Tomcat\\6.0") < 0) then
           // MessageBox ("You haven't installed JRE 1.6.0_04 yet! ", INFORMATION);
            LaunchAppAndWait ("../tomcat\\apache-tomcat-6.0.24.exe", "", LAAW_OPTION_WAIT);
        endif;
64位下的,我在代码前加了Enable(REGDB_OPTION_WOW64_64KEY);但是毫无效果

调用之前添加这么一行
REGDB_OPTIONS = REGDB_OPTION_WOW64_64KEY

判断代码:SYSINFO.bIsWow64

3、如何检测第三方软件是否安装,不知道安装路径的情况下
用RegDBKeyExist检查注册表

如果我不知道第三方软件的注册表值,那搜索注册表。

读取 SOFTWARE/MICROSOFT/WINDOWS/CURRENTVERSION/UNINSTALL,查看是否包括相应的项,然后在脚本里判断相应的CLSID值
迅(38495561)  17:29:19
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
if (RegDBKeyExist("SOFTWARE \\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{9A25302D-30C0-39D9-BD6F-21E6EC160475}")< 0) then      
 if (RegDBKeyExist("SOFTWARE \\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{86CE1746-9EFF-3C9C-8755-81EA8903AC34}")< 0) then      
  if(LaunchAppAndWait(SRCDIR^"reases\\插件 \\vcredist_x86.exe","", LAAW_OPTION_WAIT)<0)then
     if( FindFile(SRCDIR^"program files\\软件\\插件","vcredist_x86.exe",svResult)=0 ) then   
         MessageBox("系统检测到没有安装插件,现在要进行安装!", WARNING);
         LaunchAppAndWait( SRCDIR^"program files\\软件\\插件 \\vcredist_x86.exe","",NOWAIT );
     endif;     
  endif;
 endif;  
endif;

参考文章:
http://www.cnblogs.com/Cindy_weiwei/archive/2009/05/19/1460261.html
参阅第四部分:补遗

 http://www.appinstall.cn/viewthread.php?tid=670&extra=page%3D2
这是枚举注册表键值

4、OnBegin里加这一句,就没有—installshieldWizard:SetTitle(IFX_PRODUCT_NAME, 0, BACKGROUNDCAPTION);
  function OnBegin()
string szMyCustomTitle;
begin
 szMyCustomTitle = IFX_PRODUCT_NAME + " " + IFX_PRODUCT_VERSION;
    SetTitle(szMyCustomTitle , 0, BACKGROUNDCAPTION);
end;

5、Basic MSI的序列号存在一个Property,想在ISX_SERIALNUM位置校验Kevin Wan(17842153)  16:05:28
)大概这样一个逻辑:

1,写脚本校验Property ISX_SERIALNUM的值
2,将脚本函数与Custom Action绑定
3,在Next控件中添加一个Event,调用你的CA,条件为:1
补充一下,校验结果还得存在一个Property中
4,你的Next控件Conditions中,根据校验结果控制Disable和Enable

其中Property的读写你用MsiGetProperty 和MsiSetProperty
步骤3中:添加DoAction的Event,调用CA

6、如果在install design的splash screen里加入一张名为setup.bmp的图片,并且把release->small initiliaze dialog设为yes,安装一开始会展示出你的图片,效果非常漂亮

installscript工程自带的SdFinish(在OnFirstUIAfter里)允许你添加两个checkbox,不过如果你要添加三个,就得用SdAskOptions,但是这个界面无法默认做为最后一个结束界面,只能插入到SdFinish前面

7、不能用直接aunchAppAndWait调用cpl文件,需要和C:\Winnt\system32\control.exe相关联
LaunchAppAndWait (环境路径, 被打开的对象, WAIT);
 szApplicationPath = WINSYSDIR64^"msiexec.exe ";
 szApplicationCmdLine = INSTALLDIR^"tfmessbspsetup.msi";
 LongPathToQuote( szApplicationPath, TRUE );
 szCmdLine = szApplicationPath +  " " + "/i" + " " + "\"" + szApplicationCmdLine + "\"" ; 
 LaunchAppAndWait ("", szCmdLine, WAIT);
即:
C:\WINDOWS\system32\control.exe "C:\Program Files\Biocome\Bio-Trust Fingerprint Logon-server\monitor.cpl"

8、补丁包 增加快捷方式

szCommandLine = TARGETDIR ^  svKeyName;
             szIconPath = szCommandLine;
             LongPathToQuote  (szCommandLine, TRUE);
             nResult = AddFolderIcon(szProgram, svKeyVal,
                                     szCommandLine,
                                     szWorkingDir,
                                     szIconPath,
                                     nIcon,
                                     szShortCutKey,nFlag);
               
                if(nResult<0) then
                   MessageBox("创建快捷方式: " + svKeyVal + "=>" + szCommandLine + " 失败", INFORMATION);
                endif;
                nVal = ListGetNextString (listKeyNames, svKeyName);
                if !(nVal = END_OF_LIST) then
                    ListGetNextString (listKeyValues, svKeyVal);
                endif;

//添加开始菜单里的快捷方式
    AddFolderIcon(
      FOLDER_PROGRAMS^m_strShowPDMName+@ID_SHORTCUTPDM
         @ID_SHORTCUTGSMSG,
         "\""+TARGETDIR^m_strPDMPATH+" \\GSMsg.exe\" ",
         TARGETDIR^m_strPDMPATH,
         "",
         0,
         "",
         REPLACE);    

9、安装系统后,从系统的一个位置拷贝一个文件到另外一个位置:
CopyFile (WINSYSDIR^"msgina.dll", INSTALLDIR^"oldmsgina.dll");

10、通过域分发部署软件,增加Transforms文件的命令参数调用方法:msiexec /i "ProductName.msi" TRANSFORMS="YourTransform.mst"

InstallShield 2009 Premier, Basic MSI Project:
After uninstall completes, I want to force restart the computer. How?
Googling found, i have to set 'REBOOTPROMPT' TO 'S' or 'R' and the "Reboot" property.
How to set these properties and with what values?


Here is the Solution
1. You have to let InstallShield know that you want a reboot.
How?: From 'Installation Designer' tab -> 'Behavior and Logic' -> 'Custom Actions and Sequences' -> 'Sequences' -> 'Installation' -> 'Execute' -> 'ScheduleReboot' set the value of 'Conditions' to "NOT REMOVE" (with out the inverted commas) if you want the reboot to happen after install and to "REMOVE" if after uninstall.
2. So up to now after install/uninstall the installer would show a warning message something like "... click ok to restart your machine now or cancel to restart later...". Now if you don't want to show this warning message even do step 3.
3. Go to 'Installation Designer' tab -> 'Behavior and Logic' -> 'Property Manager', a table would be open. Now add/edit the (Name, Value) pair with (REBOOTPROMPT, Suppress). This would suppress the message.

11、停止进程:
szApplicationPath = WINSYSDIR^"taskkill.exe";
 szApplicationCmdLine = "FPLockWindow.exe";
 LongPathToQuote( szApplicationPath, TRUE );
 szCmdLine = szApplicationPath +  " " + "/f" + " " + "/im" + " " + "\"" + szApplicationCmdLine + "\""; 
 LaunchAppAndWait("", szCmdLine, WAIT);

12、INFO:InstallShield中Basic MSI工程类型如何调用InstallScript脚本 : 

A. 首先在Installation Designer/Behavior and Logic/InstallScript视图中,选中Files点击鼠标右键选择“New Script File”,默认会生成一个setup.rul的文件,并有一个MyFunction的函数声明和。 

B. 之后我们在MyFunction函数内添加一行代码:MessageBox("MyFunction", INFORMATION);

当然,你也可以修改函数名,用更有实际意义字符串代替。 

C. 在Installation Designer/Behavior and Logic/Custom Actions and Sequences视图中,选中顶端的Custom Actions点击鼠标右键选择“Custom Action Wizard”(这里的Custom Action我们经常也简称为CA),下面按着向导逐步说明。

1. 第一个界面是Custom Action Wizard欢迎界面。
2.在第二个Basic Information界面中,选择CA的Name,而Comment可忽略。
3.在第三个Action Type界面中,在Type的下拉菜单中选择Run InstallScript Code。(这里你会发现你可以通过CA调用托管代码,其他可执行程序,以及JScript,VBScript等)
4.在第四个Action Parameters界面中,在Source的下拉菜单选择的MyFunction。(如果脚本Setup.rul中你有多个函数声明,你会发现都会显示到下拉菜单中)
5.之后的界面都按照默认设置,直到点击Finish结束。 

D. 在同一树状结构中,Sequences/Installation/Execute,选中Execute点击鼠标右键选择Insert,你会看到在C中你添加的CA,选中你的CA,然后设置Condition。(注意如果是想在安装时执行:Not Installed;如果是卸载执行:Installed) 

E. 有关我们的CA在Sequence中的位置, 可根据情况调整位置。

13、工程basic msi。
要求某个文件在安装的时候添加进去,但是卸载的时候保留,怎么操作。
把这个文件的属性指定为permanent
如果是脚本添加的文件,可以在添加语句前后把IS的日志禁用掉
Disable(LOGGING);
添加文件的语句
Enable(LOGGING);

14、安装包打日志:
c:\Setup.exe /Verbose"C:\Setup.log"
c:\Setup.msi /log"C:\Setup.log"

15、在Basic MSI工程里,可以通过AppDataFolder这个变量获取到类似下面的目录
C:\Documents and Settings\user\Application Data
在installscript工程用FOLDER_APPDATA

posted @ 2011-07-28 13:55  蓝欣児  Views(627)  Comments(0Edit  收藏  举报