乍一看,我没有运气
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软件的替代解决方案,在这些条件或其他条件下,在这个服务器上(例如批量用户),我很乐意尝试它们!
答案 0 :(得分:1)
一个服务在另一个会话中运行,因此另一个win站因此你不能使用ShellExecute,因为服务win站根本没有shell;可能没有登录用户等等。唯一但是是交互式服务,但在较新的Windows版本上不再支持这些服务(如果我没记错的话,可以从Vista及以上版本获得)。
正如大卫在下面的评论中所提到的:应该可以使用以下方式启动流程:
ShellExecute(0, 'open', 'sleep.exe', '60', '', SW_HIDE);
我用不同的程序对它进行了测试,但它失败了,所以它可能取决于您希望启动的应用程序,所以显然这个答案是不正确的。它仍然提供一些洞察信息,所以除非有人问我,否则我会留在这里。
答案 1 :(得分:0)
您对问题的更新报告称,从标准应用程序运行时对CreateProcess
的调用有效,但从服务运行时失败。这个问题肯定与会话0的服务隔离有关。有了这些信息,我可以想到以下解释:
D:\EMF2PDF\...
路径不可用。检查您是否可以在此处创建并打开文本文件,以查看此诊断是否属实。emf2pdf
程序不兼容。如果是这样,那么您将需要找到另一个程序来进行转换。这可能很难做到,因为处理EMF的程序可能会使用GDI命令,并且它们很可能在服务环境中失败。到目前为止,最简单的解决方案是将此过程作为标准应用程序运行。我可以看到,对于似乎是服务器服务而言,这可能不是一个可口的前景。
答案 2 :(得分:0)
我们在这里遇到了完全相同的问题。我们还使用命令行工具生成PDF。
如果您在服务对话框中查看服务的属性,则可以在“登录”标签页上看到一个复选框。该复选框的标题为“允许服务与桌面交互”。将其设置为选中。
此处的答案之一表明在较新的Windows版本上不再可行,但它在Windows 7和Windows 2008服务器上运行良好。
编辑:服务属性中的设置可能已经改变了它的含义,我不知道。但它解决了我们的问题。选中此复选框后,我们用于生成PDF的命令行工具运行正常。