关于捕获Dos窗口!!!

city1000 2002-04-23 10:43:24
比如我有一个Dos窗口程序,我怎么在C++ Builder里面实时的捕获
dos窗口的输出信息,并把它显示在我的Memo框中呢?就像EditPlus
中的捕获dos输出的效果一样?
...全文
24 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
invalid 2002-04-23
  • 打赏
  • 举报
回复
查查以前的帖子:
参考一下BCB的例子,Wintools,有代码.参见下面:
bool TForm1::IsWindowsNT()
{
OSVERSIONINFO osv;
osv.dwOSVersionInfoSize = sizeof(osv);
GetVersionEx(&osv);
return (osv.dwPlatformId == VER_PLATFORM_WIN32_NT);
}

void __fastcall TForm1::RunBtnClick(TObject *Sender)
{
int FBreak;
String TempFile;
Screen->Cursor = crHourGlass;

Application->ProcessMessages();

// If NT do security stuff
SECURITY_DESCRIPTOR sd;
SECURITY_ATTRIBUTES sa;
LPSECURITY_ATTRIBUTES lpsa = NULL;
if (IsWindowsNT()) {
InitializeSecurityDescriptor(&sd,
SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, true, NULL, false);
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = true;
sa.lpSecurityDescriptor = &sd;
lpsa = &sa;
}

// Create the Pipe and get r/w handles
HANDLE hReadPipe;
HANDLE hWritePipe;
assert(CreatePipe(&hReadPipe,
&hWritePipe,
lpsa,
2500000));
// initialize STARTUPINFO struct
STARTUPINFO si;
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW |STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdOutput = hWritePipe;
si.hStdError = hWritePipe;
PROCESS_INFORMATION pi;
assert(hWritePipe);
// Run the cmdLine tool
memo1->Lines->Add("Working.....");
Application->ProcessMessages();

if( CreateProcess(NULL,
CmdEdit->Text.c_str(),
NULL,//security
NULL,// security
TRUE,//inherits handles
0,
0,
0,
&si,
&pi)

){
CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess, 90000);

// read from the pipe and put in richedit
assert(hReadPipe);
DWORD BytesRead; //unsigned long
char dest[4000];
bool RdLoopDone = false;
memo1->Lines->Clear();
FBreak = 1;
if (ExitCode) Screen->Cursor = crDefault;
while (!RdLoopDone) {
memset(dest, 0, 4000);
assert(ReadFile(hReadPipe, &dest, sizeof(dest), &BytesRead, NULL));
memo1->Lines->Add(String(dest));
if (BytesRead < 4000) RdLoopDone = true;
if (FBreak > 150) RdLoopDone = true;
FBreak++;
}
memo1->Lines->Add("FINISHED!");
}//if CreateProcess
else{
Screen->Cursor = crDefault;
memo1->Lines->Add("FINISHED!");
ShowMessage("Unable to execute program.");
}
// Process cleanup
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
CloseHandle(pi.hProcess);
memo1->Perform(EM_SETSEL,0,0);
Screen->Cursor = crDefault;

}



kimryo 2002-04-23
  • 打赏
  • 举报
回复
有点像

dir>c:\dir.txt

命令。
kimryo 2002-04-23
  • 打赏
  • 举报
回复
有点像

dir>c:\dir.txt

命令。
kimryo 2002-04-23
  • 打赏
  • 举报
回复
用管道(Pipe)重定向输出,再用CreateProcess启动一个SW_HIDE的CMD窗体.

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧