从服务的Execute线程执行命令行

时间:2011-11-23 16:19:04

标签: windows delphi winapi service delphi-7

乍一看,我没有运气

uses ShellApi;

...

ShellExecute(Handle, pchar('open'), pchar('emf2pdf.exe'), 
             pchar(s), pchar(root), SW_SHOWNORMAL);

其中s是参数字符串,root是命令所在的目录。

我得到的错误是“缺少运算符或分号”,以及“实际参数太多”。

可能有些容易让我忽略,有点紧张。甚至不知道从哪里拿到Handle。

对于您可以建议的执行命令行的其他方法感到高兴!基本上,服务会定期查找要转换的文件,所以我只是想找到一种方法来形成一个命令行,比如在DOS中执行它,最好没有窗口弹出并关闭,但我会采取什么我可以得到。 :)

我正确安装Delphi可以为我提供代码提示参数,但不会弹出按F1的帮助页面(在索引中找不到)。

更新:使用DelphiPages中的这个CreateProcess函数:

Function ExecuteAndWait(sExecutableFile : String; wWindowState : Word = SW_SHOWNORMAL) : Boolean;
var
siInfo : TStartUpInfo;
piInfo : TProcessInformation;
begin
    FillChar(siInfo, SizeOf(siInfo), #0);

    with siInfo do begin
    cb := SizeOf(siInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := wWindowState;
    end;
    Result := CreateProcess(NIL, pChar(sExecutableFile), NIL, NIL, FALSE, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, NIL, pchar(ExtractFilePath(sExecutableFile)),siInfo, piInfo);
    if Result then
    WaitForSingleObject(piInfo.hprocess,INFINITE);
end;

然后用这个命令行调用它,它在粘贴在'cmd'时起作用,但不能用这个代码:

ExecuteAndWait('D:\EMF2PDF\emf2pdf.exe -append 0 -margin 36x36x36x36 -width 595 -height 420 "D:\EMF2PDF\EMF\example.emf" "D:\EMF2PDF\PDF\example.pdf"');

如果您能提供(链接到)上述控制台应用命令行的工作示例调用(在服务中),我会很高兴。

更新: 有问题的命令不打开窗口,但在控制台中键入转换的统计信息。我在这里使用可下载的软件:http://www.verydoc.com/emf-to-pdf.html

此外,直到现在我还没有被告知有问题的服务器是虚拟服务器,如果这有所不同。

刚刚检查过,当我试用我的服务时,我以远程会话用户身份登录。当Windows与登录用户一起运行时,该服务是否至少无法创建调用emf2pdf的进程?

如果你能想到使用Verydoc软件的替代解决方案,在这些条件或其他条件下,在这个服务器上(例如批量用户),我很乐意尝试它们!

3 个答案:

答案 0 :(得分:1)

一个服务在另一个会话中运行,因此另一个win站因此你不能使用ShellExecute,因为服务win站根本没有shell;可能没有登录用户等等。唯一但是是交互式服务,但在较新的Windows版本上不再支持这些服务(如果我没记错的话,可以从Vista及以上版本获得)。

正如大卫在下面的评论中所提到的:应该可以使用以下方式启动流程:

ShellExecute(0, 'open', 'sleep.exe', '60', '', SW_HIDE);

我用不同的程序对它进行了测试,但它失败了,所以它可能取决于您希望启动的应用程序,所以显然这个答案是不正确的。它仍然提供一些洞察信息,所以除非有人问我,否则我会留在这里。

答案 1 :(得分:0)

您对问题的更新报告称,从标准应用程序运行时对CreateProcess的调用有效,但从服务运行时失败。这个问题肯定与会话0的服务隔离有关。有了这些信息,我可以想到以下解释:

  1. 在服务的上下文中,D:\EMF2PDF\...路径不可用。检查您是否可以在此处创建并打开文本文件,以查看此诊断是否属实。
  2. 会话0隔离与emf2pdf程序不兼容。如果是这样,那么您将需要找到另一个程序来进行转换。这可能很难做到,因为处理EMF的程序可能会使用GDI命令,并且它们很可能在服务环境中失败。
  3. 到目前为止,最简单的解决方案是将此过程作为标准应用程序运行。我可以看到,对于似乎是服务器服务而言,这可能不是一个可口的前景。

答案 2 :(得分:0)

我们在这里遇到了完全相同的问题。我们还使用命令行工具生成PDF。

如果您在服务对话框中查看服务的属性,则可以在“登录”标签页上看到一个复选框。该复选框的标题为“允许服务与桌面交互”。将其设置为选中。

此处的答案之一表明在较新的Windows版本上不再可行,但它在Windows 7和Windows 2008服务器上运行良好。

编辑:服务属性中的设置可能已经改变了它的含义,我不知道。但它解决了我们的问题。选中此复选框后,我们用于生成PDF的命令行工具运行正常。