7

我没有在帮助中找到对 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 Setup 安装程序)以管理权限运行

4

3 回答 3

7

在 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); 
于 2012-04-30T10:03:48.127 回答
3

您是否考虑过使用CreateProcess来启动流程?此调用提供了一些额外的选项来控制结果过程,并且还可以更好地处理传递的参数。

于 2012-04-29T17:13:31.967 回答
3

如果您可以使用 JEDI JVCL 库,他们有一个很好的组件可以为您封装 CreateProcess:

http://jvcl.delphi-jedi.org/

查看 JvCreateProcess 和 JvCreateProcessExtended 组件。JEDI JVCL 是免费和开源的,并在 Mozilla Public License 下发布。

于 2012-04-30T05:03:35.937 回答