论坛首页
论坛首页 开发者论坛 PortableApps开发 自动判断系统是X86或X64

自动判断系统是X86或X64

讨论关于便携软件开发的技术与问题,包括PAL、NSIS、VMware ThinApp及其他。
burnt 红心可鉴
红心可鉴

帖子: 53
请教:如何自动判断系统是X86或X64,假设如果是X86时注册 X86.dl 如果是X64时注册 X64.dll

jooseng 革命同志
革命同志

帖子: 3475
用CustomCode:


${If} $Bits = 64
注册 X64.dll
${Else}
注册 X86.dll
${EndIf}

burnt 红心可鉴
红心可鉴

帖子: 53
jooseng 写道:
用CustomCode:


${If} $Bits = 64
注册 X64.dll
${Else}
注册 X86.dll
${EndIf}


我用regdll X64.dll 好像是不能注册,而且已经用管理员身份运行

jooseng 革命同志
革命同志

帖子: 3475
dll注册的问题还没完全解决,Portableapps.com把需要注册dll的软件定为不能便携化。
其他便携软件作者分别用了不同的方法,但都不完美。

burnt 红心可鉴
红心可鉴

帖子: 53
jooseng 写道:
dll注册的问题还没完全解决,Portableapps.com把需要注册dll的软件定为不能便携化。
其他便携软件作者分别用了不同的方法,但都不完美。



谢谢!慢慢学习

fallenyugo 两把菜刀
两把菜刀

帖子: 14
jooseng 写道:
用CustomCode:


${If} $Bits = 64
注册 X64.dll
${Else}
注册 X86.dll
${EndIf}

请问Jooseng如果我想把下面这段话的代码改一下,让启动器自行决定是写入"TotalCMD.exe"还是"TotalCMD64.exe",应该怎么写?
代码: 全选
[FileWrite4]
Type=INI11
File=%PAL:DataDir%\settings\Everything.ini
Section=open_folder_command2
Key=language
Value=$exec("%PAL:DataDir%\..\..\..\TotalCommander\TotalCMD.exe" "/O" "/T" "$parent(%1)")

jooseng 革命同志
革命同志

帖子: 3475
fallenyugo 写道:
请问Jooseng如果我想把下面这段话的代码改一下,让启动器自行决定是写入"TotalCMD.exe"还是"TotalCMD64.exe",应该怎么写?
代码: 全选
[FileWrite4]
Type=INI11
File=%PAL:DataDir%\settings\Everything.ini
Section=open_folder_command2
Key=language
Value=$exec("%PAL:DataDir%\..\..\..\TotalCommander\TotalCMD.exe" "/O" "/T" "$parent(%1)")

PAL只是一个ini文件。你只能用这些环境变量:
http://portableapps.com/manuals/Portabl ... ref-envsub
或在CustomCode里设置的自定义变量。

如果你是想要在32位里运行..\xxxPortable\App\TotalCMD\TotalCMD.exe,
在64位里运行..\xxxPortable\App\TotalCMD\TotalCMD64.exe。

可以这样写:

[Launch]
ProgramExecutable=TotalCMD\TotalCMD.exe
ProgramExecutable64=TotalCMD\TotalCMD64.exe

burnt 红心可鉴
红心可鉴

帖子: 53
jooseng 写道:
fallenyugo 写道:
请问Jooseng如果我想把下面这段话的代码改一下,让启动器自行决定是写入"TotalCMD.exe"还是"TotalCMD64.exe",应该怎么写?
代码: 全选
[FileWrite4]
Type=INI11
File=%PAL:DataDir%\settings\Everything.ini
Section=open_folder_command2
Key=language
Value=$exec("%PAL:DataDir%\..\..\..\TotalCommander\TotalCMD.exe" "/O" "/T" "$parent(%1)")

PAL只是一个ini文件。你只能用这些环境变量:
http://portableapps.com/manuals/Portabl ... ref-envsub
或在CustomCode里设置的自定义变量。

如果你是想要在32位里运行..\xxxPortable\App\TotalCMD\TotalCMD.exe,
在64位里运行..\xxxPortable\App\TotalCMD\TotalCMD64.exe。

可以这样写:

[Launch]
ProgramExecutable=TotalCMD\TotalCMD.exe
ProgramExecutable64=TotalCMD\TotalCMD64.exe



PAL 的制作方式确实要比NSIS 简单的多,如果用NSIS 哪就麻烦多了:
代码: 全选
!include "x64.nsh"

SetOutPath "$EXEDIR\${APPDIR}"
${GetParameters} $0
${If} ${RunningX64}
${AndIf} ${FileExists} "$EXEDIR\${APPDIR}\TotalCMD64.exe"
ExecWait `"$EXEDIR\${APPDIR}\TotalCMD64.exe`
${Else}
ExecWait `"$EXEDIR\${APPDIR}\TotalCMD.exe`
${EndIf}
FunctionEnd

fallenyugo 两把菜刀
两把菜刀

帖子: 14
jooseng 写道:
PAL只是一个ini文件。你只能用这些环境变量:
http://portableapps.com/manuals/Portabl ... ref-envsub
或在CustomCode里设置的自定义变量。

如果你是想要在32位里运行..\xxxPortable\App\TotalCMD\TotalCMD.exe,
在64位里运行..\xxxPortable\App\TotalCMD\TotalCMD64.exe。

可以这样写:

[Launch]
ProgramExecutable=TotalCMD\TotalCMD.exe
ProgramExecutable64=TotalCMD\TotalCMD64.exe

情况比这个要复杂一些,涉及到便携版Everything和便携版TC之间的相互调用,因此需要根据系统调整调用的主程序,因为如果直接调用启动器会出现另一个便携进程正在运行的问题导致中断。
尝试了写代码,但看手册要使用到 hook,而我还没找到一个可供参考的例子,我不太确定之下便先行请教了。

fallenyugo 两把菜刀
两把菜刀

帖子: 14
burnt 写道:
PAL 的制作方式确实要比NSIS 简单的多,如果用NSIS 哪就麻烦多了:
代码: 全选
!include "x64.nsh"

SetOutPath "$EXEDIR\${APPDIR}"
${GetParameters} $0
${If} ${RunningX64}
${AndIf} ${FileExists} "$EXEDIR\${APPDIR}\TotalCMD64.exe"
ExecWait `"$EXEDIR\${APPDIR}\TotalCMD64.exe`
${Else}
ExecWait `"$EXEDIR\${APPDIR}\TotalCMD.exe`
${EndIf}
FunctionEnd

确实比较麻烦,但如果要实现某些PAL目前还不能实现的效果,就非NSIS不可吧?

fallenyugo 两把菜刀
两把菜刀

帖子: 14
请帮我检查一下,如果这样写custom.nsh,能否正确运作?
是给EverythingPortable用的。
代码: 全选
${SegmentFile}
Var [TotalCMDProgam]
!include "x64.nsh"
SetOutPath "$EXEDIR\${APPDIR}"
${GetParameters} $0

${If} $Bits = 64
${AndIf} ${FileExists} "$EXEDIR\${APPDIR}\..\..\TotalCommanderPortable\App\TotalCommander\TotalCMD64.exe"
${TotalCMDExec}="TotalCMD64.exe"
${Else}
${TotalCMDExec}="TotalCMD.exe"
${EndIf}

然后把被调用的程序指向"%PAL:AppDir%\..\..\TotalCommanderPortable\App\TotalCommander\%TotalCMDProgam%"

burnt 红心可鉴
红心可鉴

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

${If} $Bits = 64 ;所以我认为语法上是错误的

PAL 怎么解决自动化判断我不清楚,我用的是NSI

如果是写custom.nsh的话
SetOutPath "$EXEDIR\${APPDIR}" ;输出路径应该可以不用写

fallenyugo 两把菜刀
两把菜刀

帖子: 14
谢谢burnt!谢谢jooseng!你们的回答对我很有所启发。
不过PortableAppZ上的TotalCMD升级到8.51a之后,不会再出现直接调用启动器提示另一个进程正在运行的错误了。问题就这么以另外一种方式被“解决”掉了。


回到 PortableApps开发