我在帮助中找不到Shellexec和Exec之间差异的详尽解释。是
Shellexec('','program.exe',params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode)
相当于
Exec('program.exe',params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode)
使用exe文件时?当然,当我想要执行与exe或批处理不同的文件时,请使用Shellexec。
然而,有时候,我无法通过Shellexec和Exec使我的指示正常工作。唯一可行的解决方案是编写批处理文件并通过shellexec运行它。就个人而言,我不喜欢这个解决方案,因为我必须处理一个临时文件而且我不相信所获得的结果代码。 现在我必须回到批处理文件解决方案,因为我不知道如何使这个指令工作:(错误是如果目标文件尚不存在,它会引发指令失败,在命令提示符下,即使目标文件不存在,该指令仍可正常工作。)
mysqldump := 'C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin\mysqldump.exe';
params := '-uroot -ppassword myschema>C:\myappdir\backup\newbackup.sql';
//the destination folder exists, the file newbackup.sql does not exist
Shellexec('',mysqldump,params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode);
我正在使用Windows 7 64位,该程序(Inno安装程序安装程序)以管理权限运行
答案 0 :(得分:5)
在Inno Setup的那种情况下,这两个电话几乎完全相同。但是,如果设置在最低权限运行,并且您尝试运行需要提升的流程,ShellExec()
将允许它提示,而Exec()
将失败。
当传递单个整体命令行,传递不可执行文件或使用"open"
以外的动词时,两者之间会出现差异。
请注意,这两个函数都不允许您运行命令解释程序提供的命令或操作,如重定向运算符(... > ...
)。
这些命令需要传递给{cmd}
才能运行。
这是一些空气代码:
mysqldump := 'C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin\mysqldump.exe';
params := '-uroot -ppassword myschema';
dumpfile : = 'C:\myappdir\backup\newbackup.sql';
command := AddQuotes(mysqldump) + ' ' + params + ' >' + AddQuotes(dumpfile);
Exec(ExpandConstant('{cmd}'), '/C ' + command, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
答案 1 :(得分:2)
您是否考虑过使用CreateProcess来启动此流程?此调用提供了一些额外的选项来控制生成的过程,也可以处理更好的传递的参数。
答案 2 :(得分:2)
如果你可以使用JEDI JVCL库,它们有一个很好的组件,可以为你封装CreateProcess:
查看JvCreateProcess和JvCreateProcessExtended组件。 JEDI JVCL是免费和开源的,并根据Mozilla Public License发布。