2011-11-23 36 views
1

乍一看执行一个命令行我在与从服务的执行线程

uses ShellApi; 

... 

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

没有运气s是参数字符串和根就是命令所在的目录。

我得到的错误是'缺少运算符或分号',还有'太多实际参数'。

大概是我忽视的东西,有点压力。甚至不知道从哪里拿到手柄。

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

我正确安装的德尔福可以代码提示参数为我,但不弹出帮助页上按F1(索引中找不到)。

更新:使用该CreateProcess函数从DelphiPages:

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

我:

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; 

然后用这个命令行中,“加利福尼亚”粘贴时,但没有与此代码工作称它为如果你可以提供(链接到)上面的控制台应用程序命令行的一个工作示例调用(在服务中),那么我会很高兴。

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

此外,我直到现在才被告知服务器是虚拟服务器,如果这有所作为。

刚刚检查,当我尝试使用我的服务时,我以远程会话用户身份登录。当Windows使用登录用户运行时,该服务是否能够至少创建一个调用emf2pdf的进程?

如果您可以考虑使用Verydoc软件的替代解决方案,那么在这些条件或其他条件下,在此服务器上(例如批处理用户),我很乐意尝试它们!

+5

1.您是否尝试过使用标准应用程序?那里会发生什么?不要尝试从服务中调试它,直到它从标准应用程序中运行。 2.''有什么价值,'root'有什么价值? 3.你在做什么操作系统。如果您使用的是Vista或更高版本,则无需担心任何Windows出现在服务中。 –

+0

1.在正常的应用程序中运行正常,但如上所述,粘贴到执行线程中的相同代码行甚至不能编译。 2. s =特定于emf2pdf命令的misc开关,root ='D:\ EMF2PDF'。 3. Windows Server 2008 R2 Standard,64位。 –

+0

有些事情我不清楚。您的服务调用'CreateProcess'在系统帐户下运行吗?你想在某个用户的桌面上运行'emf2pdf.exe'。你如何识别用户?可以用它来模拟它吗?您知道哪些信息来识别用户的会话?另一个问题:您是否希望在服务凭证或用户凭证下运行“emf2pdf.exe”进程? – Oleg

回答

1

服务运行在另一个会话内,因此另一个赢站,所以你不能使用ShellExecute因为服务win站根本没有外壳;可能没有登录用户等等等。唯一的,但是是一种交互式服务,但是在新版Windows版本(如果我正确记得,从Vista和更高版本)不再支持这些。

正如David在下面的评论中提到:应该可以用来启动一个进程:

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

我用不同的程序测试,它失败所以它可能取决于你要启动的应用程序显然这个答案是不正确的。它仍然提供一些见解信息,所以我会把它留在这里,除非别人问我。

+0

我不知道。我必须承认我有些惊讶。你应该建议使用'CreateProcess'的替代方案。 –

+0

其实这个答案是不正确的。完全有可能从会话0孤立服务调用ShellExecute。我刚刚这样做。当然,如果有问题的应用程序尝试显示UI,那么会出现问题。但是,本身,没有什么能阻止你使用服务中的ShellExecute。 –

+0

@David:调用本身并不是不可能的,但是它不会启动没有任何附加代码的可执行文件。我不认为不提CreateProcess使答案不正确,尽管可能不够完整。在上面的评论中,您是否有链接或支持您的声明?我很感兴趣的是看看您如何通过服务来正确运行应用程序,而无需诉诸整个系统调用来正确设置过程。 –

0

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

  1. 在服务的上下文中,D:\EMF2PDF\...路径不可用。检查您是否可以在此创建并打开文本文件,以查看此诊断是否正确。
  2. 会话0隔离仅与emf2pdf程序不兼容。如果是这样,那么你将需要找到另一个程序来完成转换。这可能很难做到,因为它处理EMF的程序可能会使用GDI命令,并且它们很可能在服务环境中失败。

到目前为止,最简单的解决方案是将此过程作为标准应用程序运行。我可以看到,这看起来似乎是一种服务器服务,这可能不是一个可口的前景。

+0

1.这是有效的,因为我从中截取传递给CreateProcess的完整命令行的日志文件在那里写得很好。 2.你的意思是我可以编写一个标准的Delphi应用程序(使用f.ex. ShellExecute调用emf2pdf)并使用服务中的参数调用它?我可以使用另一个“介体”,例如编写.bat文件并使用CreateProcess从服务中调用它?怎么样DETACH_PROCESS和CREATE_NEW_PROCESS标志? –

+0

在这种情况下,我敢打赌,2是障碍。 –

+0

很快!意外输入新闻,添加评论到2. –

0

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

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

这里的答案之一表明,这不再可能在较新的Windows版本上,但它在Windows 7和Windows 2008服务器上运行得很好。

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

+0

非常好,因为我的电话肯定会出现问题。您使用CreateProcess的参数是什么?我可以从命令提示符/控制台运行转换命令行,服务试图这样做后没有发生任何事情。 –

+1

“这里的答案之一表明,在新版Windows上这不再可能,但它在Windows 7和Windows 2008服务器上运行得很好。”我不同意这一点。 –

+0

我对Vista及其设置的理解是,它允许服务与会话0中的隐藏桌面进行交互。因此,该设置不再执行它在XP中所做的操作,并允许服务与登录用户的桌面进行交互。这是什么意思,说它不适用于Vista。也就是说,这可能会解决手头的问题。 –