NSIS x64 位系统下安装

NSIS生成的安装程序都是32位的应用程序,所以在x64下运行时,所安装的文件会被自动转向,如安装到C:\Windows\System32目录下的文件会被安装到C:\Windows\SysWOW64目录下。这对于有些软件是不方便的。

NSIS 已经有现成的头文件 x64.nsh (X:\NSIS\Include\x64.nsh) 供大家使用。首先需要引用

[plain]  view plain  copy
 print ?
  1. !include "x64.nsh"  

x64.nsh 里有三个宏:
RunningX64 : 检查运行环境是否是X64
DisableX64FSRedirection : 禁止文件转向
EnableX64FSRedirection :  允许文件转向


简单的测试代码:

[plain]  view plain  copy
 print ?
  1. !include x64.nsh  
  2.   
  3. Function .onInit  
  4.         ${If} ${RunningX64}   
  5.         ${EnableX64FSRedirection}   
  6.         ${else}  
  7.         MessageBox MB_OK "Sorry this application runs only on x64 machines"  
  8.         Abort  
  9.         ${EndIf}  
  10. FunctionEnd  
  11.   
  12. Section -  
  13.        Detailprint '$SYSDIR'  
  14.        DetailPrint '$WINDIR'  
  15.        DetailPrint '$PROGRAMFILES'  
  16. SectionEnd  


1、检测操作系统是否为 x64 系统

可以读环境变量 PROCESSOR_ARCHITECTURE,该变量在 32 位系统为 x86,在 AMD 的 x64 的机器和在 Intel 的 x64 机器上为 AMD64,在安腾(Itanium)系统为 IA64。

[plain]  view plain  copy
 print ?
  1. ReadEnvStr $Win64 PROCESSOR_ARCHITECTURE  
  2. StrCmp $Win64 "x86" lbl_Win32  


2、注册COM组件,需包含 Library.nsh,用宏 InstallLib/UnInstallLib 代替 RegDLL/UnRegDLL

[plain]  view plain  copy
 print ?
  1. ; RegDLL "$SYSDIR\ComName.dll"  
  2. !insertmacro InstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED "LocalPath\ComName.dll" "$SYSDIR\ComName.dll" $SYSDIR  
  3. ; UnRegDLL "$SYSDIR\ComName.dll"  
  4. !insertmacro UnInstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED "$SYSDIR\ComName.dll"  


3、在调用涉及注册表的函数前用 SetRegView 64,后用 SetRegView lastused

[plain]  view plain  copy
 print ?
  1. !ifdef LIBRARY_X64  
  2.  SetRegView 64  
  3. !endif  
  4.  WriteRegStr ...  
  5.  WriteRegStr ...  
  6.  WriteRegStr ...  
  7. !ifdef  LIBRARY_X64  
  8.  SetRegView lastused  
  9. !endif   



4、在调用涉及目标机器上系统目录(即 $SYSDIR)的函数前用 {DisableX64FSRedirection}


5、在 64 位系统上 $PROGRAMFILES64 表示“Program Files”, $PROGRAMFILES 表示 “Program Files (x86)”

可以在安装脚本的开始处定义一个常量:

[plain]  view plain  copy
 print ?
  1. !ifdef LIBRARY_X64  
  2.     !define PROGRAM_FILES_FIX  $PROGRAMFILES64  
  3. !else  
  4.     !define PROGRAM_FILES_FIX  $PROGRAMFILES  
  5. !endif  
以后直接用 ${PROGRAM_FILES_FIX} 代替 $PROGRAMFILES。


6、可以做个批处理文件,一次性生成 32位/64 位的安装包

[plain]  view plain  copy
 print ?
  1. makensis .\myinstaller.nsi  
  2. makensis /DLIBRARY_X64 .\myinstaller.nsi    ; 使用 /D 参数  
  3. pause  

参考资料:

NSIS在x64系统下的使用

NSIS生成的安装程序都是32位的应用程序,所以在x64下运行时,所安装的文件会被自动转向,如安装到C:\Windows\System32目录下的文件会被安装到C:\Windows\SysWOW64目录下。这对于有些软件是不方便的。一个办法是重新编译NSIS的代码为64位,就是有点麻烦,而且需要大量的时间测试一下。利用简单的代码也可以解决类似的问题:
1、检测操作系统是否为x64系统
可以读环境变量PROCESSOR_ARCHITECTURE,该变量在32位系统为x86,在AMD的x64的机器和在Intel的x64机器上为AMD64,在安腾(Itanium)系统为IA64。可以使用下面的代码:

ReadEnvStr $Win64 PROCESSOR_ARCHITECTURE
StrCmp $Win64 "x86" lbl_Win32

2、禁止文件转向
调用Wow64EnableWow64FsRedirection函数可以禁止或恢复文件转向。如:
; 禁止
System::Call "Kernel32::Wow64EnableWow64FsRedirection(i 0)"
    ......
; 恢复
System::Call "Kernel32::Wow64EnableWow64FsRedirection(i 1)"

http://www.cnblogs.com/zealsoft/archive/2005/05/25/162314.html

$PROGRAMFILES on x64

http://forums.winamp.com/showthread.php?s=6f60eaa0eae8f95aef4e86eb24e31b8d&threadid=262873&highlight=X64+%24INSTDIR



备注:本文转载自:

1、http://blog.csdn.net/yysyangyangyangshan/article/details/7172294

2、http://blog.sina.com.cn/s/blog_617c05b001015hbn.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值