【发布时间】:2010-01-06 18:54:24
【问题描述】:
我有一个从 GUI 应用程序启动的控制台应用程序。控制台应用程序采用文件名参数来解析和处理。目前我能够捕获它的输出并将其显示在 GUI 应用程序中,但我希望能够向它发送命令以控制甚至停止它的执行。
如何向控制台应用程序发送命令或字符串或任何内容,最好使用我打开的管道以读取其输出?
const
CReadBuffer = 2400;
var
saSecurity: TSecurityAttributes;
hRead: THandle;
hWrite: THandle;
suiStartup: TStartupInfo;
piProcess: TProcessInformation;
pBuffer: array[0..CReadBuffer] of AnsiChar;
dRead: DWord;
dRunning: DWord;
dWritten: DWord;
Command: String;
BytesLeft: Integer;
BytesAvail: Integer;
begin
saSecurity.nLength := SizeOf(TSecurityAttributes);
saSecurity.bInheritHandle := True;
saSecurity.lpSecurityDescriptor := nil;
if CreatePipe(hRead, hWrite, @saSecurity, 0) then
begin
FillChar(suiStartup, SizeOf(TStartupInfo), #0);
suiStartup.cb := SizeOf(TStartupInfo);
suiStartup.hStdInput := hRead;
suiStartup.hStdOutput := hWrite;
suiStartup.hStdError := hWrite;
suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
suiStartup.wShowWindow := SW_HIDE;
Command := 'messageparser.exe c:\messagefile.msg';
UniqueString(Command);
if CreateProcess(nil, PChar(Command), @saSecurity,
@saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess) then
begin
repeat
dRunning := WaitForSingleObject(piProcess.hProcess, 100);
Application.ProcessMessages;
repeat
dRead := 0;
if not PeekNamedPipe(hread, @pbuffer, CReadBuffer, @dRead, @BytesAvail, @BytesLeft) then
RaiseLastOSError;
if dRead <> 0 then
begin
ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
pBuffer[dRead] := #0;
OemToCharA(pBuffer, pBuffer);
// do something with the data
// if a condition is present then do the following:
// WriteFile(hWrite, some_command, size_of_buffer, DWritten, nil);
end;
until (dRead < CReadBuffer);
until (dRunning <> WAIT_TIMEOUT);
CloseHandle(piProcess.hProcess);
CloseHandle(piProcess.hThread);
end;
CloseHandle(hRead);
CloseHandle(hWrite);
end;
然后在控制台端,有一个线程在等待输入。这是执行方法:
while not Terminated do
begin
ReadLn(Command);
// process command
Sleep(10);
end;
这对我来说是新的,所以如果有关于如何正确操作的提示,我欢迎他们:)。但是,每当我发送命令时,它都会作为我从 ReadPipe 在 pBuffer 中读取的任何内容出现,而不是命令是什么。
希望这会有所帮助。
--
根据 Nat 的提示找到了解决方案。
【问题讨论】:
-
那么你有这两个应用程序的源代码吗?它们都是用 Delphi 编写的吗?
-
我添加了源代码。
-
+1 用于发布源代码 - 在提供帮助方面发挥了重要作用。
-
谢谢。从一开始就应该这样做。