我有一个问题,
我有一台服务器作为服务运行。
...在主程序中我使用此代码进行打印
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
答案 0 :(得分:0)
Acrobat是一个带GUI的交互式程序。服务在会话0中运行,该会话没有交互式桌面。因此,在尝试执行GUI程序时会遇到问题。
显然,您已经找到了一种方法,使您的方法在会话0中工作。通过调用CreateProcess
传递读者可执行文件的完整路径。所以我想问题是你的ShellExecute
在会话0中的处理方式。一些想法:
'acrord32'
传递给'open'
动词是否可能在会话0服务的上下文中不起作用?也许您需要使用可执行文件的完整路径。也许AppPaths功能(acrord32如何解析为完整路径)不适用于会话0。AppPaths
代码工作的原因。或许,你真的需要使用CreateProcess
。在这种情况下,您至少可以通过阅读注册表找到可执行文件的路径。阅读Path
的{{1}}值。