程序作为服务运行时打印PDF

时间:2014-01-03 14:58:50

标签: delphi pdf service printing admin

我有一个问题,

我有一台服务器作为服务运行。

...在主程序中我使用此代码进行打印

  sAppName := '"C:\Program Files (x86)\Adobe\Reader 11.0\Reader\acrord32.exe" /s /o /h /n /t ' + AnsiQuotedStr(SourceFileName, '"')+' name_of_printer';

   OutputDebugString(PChar(Format('sAppName=%s', [sAppName])));
   iResult := WinExecAndNoWait32(sAppName, SW_HIDE);

这是WinExecAndWait的代码:

Function WinExecAndWait32( FileName: String; Visibility: integer ): DWORD;

  Var { V1 by Pat Ritchey, V2 by P.Below }
    zAppName:array[0..512] of char;
    StartupInfo:TStartupInfo;
    ProcessInfo:TProcessInformation;
  Begin { WinExecAndWait32V2 }
    StrPCopy(zAppName,FileName);
    FillChar(StartupInfo,Sizeof(StartupInfo),#0);
    StartupInfo.cb := Sizeof(StartupInfo);
    StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow := Visibility;
    If not CreateProcess(nil,
      zAppName, { pointer to command line string }
      nil, { pointer to process security attributes }
      nil, { pointer to thread security attributes }
      false, { handle inheritance flag }
      CREATE_NEW_CONSOLE or { creation flags }
      NORMAL_PRIORITY_CLASS,
      nil, { pointer to new environment block }
      nil, { pointer to current directory name }
      StartupInfo, { pointer to STARTUPINFO }
      ProcessInfo) { pointer to PROCESS_INF }
    Then
      Result := DWORD(-1)
    Else Begin
       Sleep(500);
       GetExitCodeProcess(ProcessInfo.hProcess, Result);
       CloseHandle( ProcessInfo.hProcess );
       CloseHandle( ProcessInfo.hThread );
    End; { Else }
  End;

但是如何在不使用AdobeReader的完整路径的情况下进行打印?

当服务器作为应用程序正常运行时,我可以调用:

ShellExecute(0, 'open', 'acrord32', PChar('/p /h ' + FileName), nil, Visibility)

当我作为服务运行时,它不起作用

你知道怎么解决吗?它必须作为没有窗口的服务工作(所以我没有任何处理程序)......

Kefas

1 个答案:

答案 0 :(得分:0)

Acrobat是一个带GUI的交互式程序。服务在会话0中运行,该会话没有交互式桌面。因此,在尝试执行GUI程序时会遇到问题。

显然,您已经找到了一种方法,使您的方法在会话0中工作。通过调用CreateProcess传递读者可执行文件的完整路径。所以我想问题是你的ShellExecute在会话0中的处理方式。一些想法:

  • 'acrord32'传递给'open'动词是否可能在会话0服务的上下文中不起作用?也许您需要使用可执行文件的完整路径。也许AppPaths功能(acrord32如何解析为完整路径)不适用于会话0。
  • 也许您需要初始化COM,这对于服务来说不会发生,但是对于VCL表单项目确实会发生。也许这就是阻止AppPaths代码工作的原因。
  • 也许您需要在SCM中为您的服务设置允许服务与桌面交互选项。但是,我对此表示怀疑。

或许,你真的需要使用CreateProcess。在这种情况下,您至少可以通过阅读注册表找到可执行文件的路径。阅读Path的{​​{1}}值。