我有一个Delphi 7(不是2007)应用程序(我们称之为App1.exe) IDE认为是一个GUI应用程序,但在DPR中是一个编译器 使其进入控制台应用程序的指令。例如:
{$IFDE MAKE_CONSOLE}
{$APPTYPE CONSOLE}
{$ENDIF MAKE_CONSOLE}
在构建过程中,可能会定义MAKE_CONSOLE。
我遇到的问题是我们有另一个控制台应用程序 (例如,App2.exe)使用WinAPI CreateProcess运行App1.exe。什么时候 发生了,App1.exe的输出无处可见:-(当 App1.exe直接从Commandline(cmd.exe)运行,输出为 显示在命令行窗口中。
我猜测的是我需要重定向App1.exe中的输出 CreateProcess,使用STARTUPINFO结构。我不确定是什么 我打算在这里做。
其他信息: *正在使用的'dwCreationFlags'是:CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS + DEBUG_PROCESS(是的,App2调试App1)
'bInheritHandles'为假(这是否需要更改?)。
'lpProcessAttributes'和'lpThreadAttributes'都是零,因为 'lpEnvironment'和'lpCurrentDirectory'。
我是否遗漏了任何帮助我的信息?
任何指针都会很棒!
非常感谢提前。
答案 0 :(得分:1)
以下是我用来从Deplhi 7调用命令行程序的一些代码。
如果将“Visibility”参数设置为0,而不是“SW_SHOWNORMAL”,它可以重定向到当前控制台(主调用exe)。
function WinExecAndWait(const FileName: String; Visibility: integer): cardinal;
var StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
Options: cardinal;
begin
FillChar(StartupInfo,Sizeof(StartupInfo),0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if Visibility=0 then begin
Flush(Output);
Options := NORMAL_PRIORITY_CLASS;
end else
Options := CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS;
if not CreateProcess(nil,
pointer(FileName), { pointer to command line string }
nil, { pointer to process security attributes }
nil, { pointer to thread security attributes }
false, { handle inheritance flag }
Options, { creation flags }
nil, { pointer to new environment block }
nil, { pointer to current directory name }
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo) then { pointer to PROCESS_INF }
Result := cardinal(-1) else begin
WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,Result);
end;
end;
答案 1 :(得分:0)
你有没有在进程创建标志中有DETACHED_PROCESS?继承父控制台应该是默认值。
答案 2 :(得分:0)
这篇MSDN文章讨论了App2如何重定向App1的输出:
答案 3 :(得分:0)
Martin Lafferty的ConsoleApp非常适合重定向控制台程序的输出。你会得到一个为每一行控制台输出调用的事件处理程序。
我找不到代码的官方主页,但这里是Embarcadero的页面: