我正在使用德尔福东京 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 文件。我在我的本地主机上运行的 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 中正确转换。有什么想法吗?