我正在使用Delphi Tokyo 10.2。我有以下功能:
function THtmlToPdfService.ExecuteShell(filename, outFilename : string) : Boolean;
var
shellInfo : TShellExecuteInfo;
exitCode : DWORD;
begin
Result := false;
try
// Set Shell execution information
FillChar(shellInfo, SizeOf(shellInfo), 0);
shellInfo.cbSize := SizeOf(TShellExecuteInfo);
shellInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
shellInfo.Wnd := 0;
shellInfo.lpFile := PChar(GetHtmlDocInstallDirectory + 'htmldoc.exe');
shellInfo.lpParameters := PChar(Format(' --webpage --datadir ' +
GetHtmlDocInstallDirectory + ' -f %s %s', [outFilename, filename]));
shellInfo.nShow := SW_HIDE;
// Run ShellExecuteEx to wait for process to complete
if ShellExecuteEx(@shellInfo) then
begin
repeat
Application.ProcessMessages;
GetExitCodeProcess(shellInfo.hProcess, exitCode) ;
until (exitCode <> STILL_ACTIVE);
if FileExists(outFilename) then
Result := true
else
RaiseLastOSError;
end;
except
raise;
end;
end;
这很简单,执行HTMLDoc.exe,使用文件名作为源HTML文件,outFilename作为目标输出PDF文件。我在我的localhost上运行的Isapi DLL和CGI EXE中都使用了相同的单元。我有一个本地测试exe,它从我的localhost调用Web服务,当我调用Isapi服务时,它工作得很好...输出PDF已创建,并且调用此函数的函数将该PDF返回给用户一个字节数组。当我从同一测试模块调用CGI服务时,它不会创建输出PDF,它只返回:
System Error. Code: 2. The system cannot find the file specified
其他一切工作正常,但它不会创建我需要的输出文件。我已经尝试了权限,身份验证,我尝试了不同的格式化文件的方法,我甚至尝试先创建PDF,希望只是将文件放在那里,即使这对Isapi无关紧要服务。我已经验证HTMLDoc和源文件都可以在此命令执行时找到,如果我首先创建PDF,则服务将空白PDF返回给用户,但我需要HTML文件在CGI中正确转换。有什么想法吗?