⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_16963.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:16963 发表者:Biter 发表日期:2002-10-06 18:21:44
<br>主题:如何调用应用程序?
<br>内容:如何在WIN32图形界面程序里运行DOS或WIN32控制台程序,且不让弹出控制台窗口而直接获取<BR>输出字符?(有没有叫一个创建I/O端口那么一说?)谢谢帮忙!
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:啊志 回复日期:2002-10-06 18:52:04
<br>内容:不会,不过可能重定向是个办法,猜猜而已
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:凯凯 回复日期:2002-10-07 09:43:44
<br>内容:可以调用,且将DOS窗口隐掉,WINZIP就是这么干的。你可以去找找资料。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:黄飚 回复日期:2002-10-07 11:57:07
<br>内容:1先回答第一个问题,给分后再回答第二个问题(我要花时间去搞一下)<BR> WinExec(" *.exe",SW_HIDE);<BR>&nbsp;&nbsp;<BR>或这CreaeProgress()<BR><BR>2.......
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:凯凯 回复日期:2002-10-07 13:21:31
<br>内容:CreaeProgress()??
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:黄飚 回复日期:2002-10-07 17:09:43
<br>内容:CreateProgress写错了
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:子龙 回复日期:2002-10-08 12:59:11
<br>内容:#include &lt;stdio.h&gt; <BR>#include &lt;windows.h&gt; <BR> <BR>#define BUFSIZE 4096 <BR> <BR>HANDLE hChildStdinRd, hChildStdinWr, hChildStdinWrDup, <BR>&nbsp;&nbsp; hChildStdoutRd, hChildStdoutWr, hChildStdoutRdDup, <BR>&nbsp;&nbsp; hInputFile, hSaveStdin, hSaveStdout; <BR> <BR>BOOL CreateChildProcess(VOID); <BR>VOID WriteToPipe(VOID); <BR>VOID ReadFromPipe(VOID); <BR>VOID ErrorExit(LPTSTR); <BR>VOID ErrMsg(LPTSTR, BOOL); <BR> <BR>DWORD main(int argc, char *argv[]) <BR>{ <BR>&nbsp;&nbsp; SECURITY_ATTRIBUTES saAttr; <BR>&nbsp;&nbsp; BOOL fSuccess; <BR> <BR>// Set the bInheritHandle flag so pipe handles are inherited. <BR> <BR>&nbsp;&nbsp; saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); <BR>&nbsp;&nbsp; saAttr.bInheritHandle = TRUE; <BR>&nbsp;&nbsp; saAttr.lpSecurityDescriptor = NULL; <BR> <BR>&nbsp;&nbsp; // The steps for redirecting child process's STDOUT: <BR>&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp; 1. Save current STDOUT, to be restored later. <BR>&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp; 2. Create anonymous pipe to be STDOUT for child process. <BR>&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp; 3. Set STDOUT of the parent process to be write handle to <BR>&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the pipe, so it is inherited by the child process. <BR>&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp; 4. Create a noninheritable duplicate of the read handle and<BR>&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close the inheritable read handle. <BR> <BR>// Save the handle to the current STDOUT. <BR> <BR>&nbsp;&nbsp; hSaveStdout = GetStdHandle(STD_OUTPUT_HANDLE); <BR> <BR>// Create a pipe for the child process's STDOUT. <BR> <BR>&nbsp;&nbsp; if (! CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorExit("Stdout pipe creation failed\n"); <BR> <BR>// Set a write handle to the pipe to be STDOUT. <BR> <BR>&nbsp;&nbsp; if (! SetStdHandle(STD_OUTPUT_HANDLE, hChildStdoutWr)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorExit("Redirecting STDOUT failed"); <BR> <BR>// Create noninheritable read handle and close the inheritable read <BR>// handle. <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdoutRd,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCurrentProcess(), &hChildStdoutRdDup , 0,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FALSE,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DUPLICATE_SAME_ACCESS);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if( !fSuccess )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorExit("DuplicateHandle failed");<BR>&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hChildStdoutRd);<BR><BR>&nbsp;&nbsp; // The steps for redirecting child process's STDIN: <BR>&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp; 1.&nbsp;&nbsp;Save current STDIN, to be restored later. <BR>&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp; 2.&nbsp;&nbsp;Create anonymous pipe to be STDIN for child process. <BR>&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp; 3.&nbsp;&nbsp;Set STDIN of the parent to be the read handle to the <BR>&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pipe, so it is inherited by the child process. <BR>&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp; 4.&nbsp;&nbsp;Create a noninheritable duplicate of the write handle, <BR>&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and close the inheritable write handle. <BR> <BR>// Save the handle to the current STDIN. <BR> <BR>&nbsp;&nbsp; hSaveStdin = GetStdHandle(STD_INPUT_HANDLE); <BR> <BR>// Create a pipe for the child process's STDIN. <BR> <BR>&nbsp;&nbsp; if (! CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorExit("Stdin pipe creation failed\n"); <BR> <BR>// Set a read handle to the pipe to be STDIN. <BR> <BR>&nbsp;&nbsp; if (! SetStdHandle(STD_INPUT_HANDLE, hChildStdinRd)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorExit("Redirecting Stdin failed"); <BR> <BR>// Duplicate the write handle to the pipe so it is not inherited. <BR> <BR>&nbsp;&nbsp; fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdinWr, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCurrentProcess(), &hChildStdinWrDup, 0, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FALSE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// not inherited <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DUPLICATE_SAME_ACCESS); <BR>&nbsp;&nbsp; if (! fSuccess) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorExit("DuplicateHandle failed"); <BR> <BR>&nbsp;&nbsp; CloseHandle(hChildStdinWr); <BR> <BR>// Now create the child process. <BR> <BR>&nbsp;&nbsp; if (! CreateChildProcess()) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorExit("Create process failed"); <BR> <BR>// After process creation, restore the saved STDIN and STDOUT. <BR> <BR>&nbsp;&nbsp; if (! SetStdHandle(STD_INPUT_HANDLE, hSaveStdin)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorExit("Re-redirecting Stdin failed\n"); <BR> <BR>&nbsp;&nbsp; if (! SetStdHandle(STD_OUTPUT_HANDLE, hSaveStdout)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorExit("Re-redirecting Stdout failed\n"); <BR> <BR>// Get a handle to the parent's input file. <BR> <BR>&nbsp;&nbsp; if (argc &gt; 1) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hInputFile = CreateFile(argv[1], GENERIC_READ, 0, NULL, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); <BR>&nbsp;&nbsp; else <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hInputFile = hSaveStdin; <BR> <BR>&nbsp;&nbsp; if (hInputFile == INVALID_HANDLE_VALUE) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorExit("no input file\n"); <BR> <BR>// Write to pipe that is the standard input for a child process. <BR> <BR>&nbsp;&nbsp; WriteToPipe(); <BR> <BR>// Read from pipe that is the standard output for child process. <BR> <BR>&nbsp;&nbsp; ReadFromPipe(); <BR> <BR>&nbsp;&nbsp; return 0; <BR>} <BR> <BR>BOOL CreateChildProcess() <BR>{ <BR>&nbsp;&nbsp; PROCESS_INFORMATION piProcInfo; <BR>&nbsp;&nbsp; STARTUPINFO siStartInfo; <BR> <BR>// Set up members of the PROCESS_INFORMATION structure. <BR> <BR>&nbsp;&nbsp; ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );<BR> <BR>// Set up members of the STARTUPINFO structure. <BR> <BR>&nbsp;&nbsp; ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );<BR>&nbsp;&nbsp; siStartInfo.cb = sizeof(STARTUPINFO); <BR> <BR>// Create the child process. <BR> <BR>&nbsp;&nbsp; return CreateProcess(NULL, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"child",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // command line <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// process security attributes <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// primary thread security attributes <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRUE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// handles are inherited <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // creation flags <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// use parent's environment <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// use parent's current directory <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&siStartInfo,&nbsp;&nbsp;// STARTUPINFO pointer <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&piProcInfo);&nbsp;&nbsp;// receives PROCESS_INFORMATION <BR>}<BR> <BR>VOID WriteToPipe(VOID) <BR>{ <BR>&nbsp;&nbsp; DWORD dwRead, dwWritten; <BR>&nbsp;&nbsp; CHAR chBuf[BUFSIZE]; <BR> <BR>// Read from a file and write its contents to a pipe. <BR> <BR>&nbsp;&nbsp; for (;;) <BR>&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (! ReadFile(hInputFile, chBuf, BUFSIZE, &dwRead, NULL) || <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwRead == 0) break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (! WriteFile(hChildStdinWrDup, chBuf, dwRead, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &dwWritten, NULL)) break; <BR>&nbsp;&nbsp; } <BR> <BR>// Close the pipe handle so the child process stops reading. <BR> <BR>&nbsp;&nbsp; if (! CloseHandle(hChildStdinWrDup)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorExit("Close pipe failed\n"); <BR>} <BR> <BR>VOID ReadFromPipe(VOID) <BR>{ <BR>&nbsp;&nbsp; DWORD dwRead, dwWritten; <BR>&nbsp;&nbsp; CHAR chBuf[BUFSIZE]; <BR>&nbsp;&nbsp; HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); <BR><BR>// Close the write end of the pipe before reading from the <BR>// read end of the pipe. <BR> <BR>&nbsp;&nbsp; if (!CloseHandle(hChildStdoutWr)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorExit("Closing handle failed"); <BR> <BR>// Read output from the child process, and write to parent's STDOUT. <BR> <BR>&nbsp;&nbsp; for (;;) <BR>&nbsp;&nbsp; { <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( !ReadFile( hChildStdoutRdDup, chBuf, BUFSIZE, &dwRead, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL) || dwRead == 0) break; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (! WriteFile(hSaveStdout, chBuf, dwRead, &dwWritten, NULL)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <BR>&nbsp;&nbsp; } <BR>} <BR> <BR>VOID ErrorExit (LPTSTR lpszMessage) <BR>{ <BR>&nbsp;&nbsp; fprintf(stderr, "%s\n", lpszMessage); <BR>&nbsp;&nbsp; ExitProcess(0); <BR>} <BR> <BR>// The code for the child process. <BR><BR>#include &lt;windows.h&gt; <BR>#define BUFSIZE 4096 <BR> <BR>VOID main(VOID) <BR>{ <BR>&nbsp;&nbsp; CHAR chBuf[BUFSIZE]; <BR>&nbsp;&nbsp; DWORD dwRead, dwWritten; <BR>&nbsp;&nbsp; HANDLE hStdin, hStdout; <BR>&nbsp;&nbsp; BOOL fSuccess; <BR> <BR>&nbsp;&nbsp; hStdout = GetStdHandle(STD_OUTPUT_HANDLE); <BR>&nbsp;&nbsp; hStdin = GetStdHandle(STD_INPUT_HANDLE); <BR>&nbsp;&nbsp; if ((hStdout == INVALID_HANDLE_VALUE) || <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(hStdin == INVALID_HANDLE_VALUE)) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExitProcess(1); <BR> <BR>&nbsp;&nbsp; for (;;) <BR>&nbsp;&nbsp; { <BR>&nbsp;&nbsp; // Read from standard input. <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fSuccess = ReadFile(hStdin, chBuf, BUFSIZE, &dwRead, NULL); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (! fSuccess || dwRead == 0) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <BR> <BR>&nbsp;&nbsp; // Write to standard output. <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fSuccess = WriteFile(hStdout, chBuf, dwRead, &dwWritten, NULL); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (! fSuccess) <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <BR>&nbsp;&nbsp; } <BR>} <BR>Creating a Child Process with Redirected Input and Output
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Biter 回复日期:2002-10-09 19:47:47
<br>内容:感谢子龙的代码,但是我想做的只是用一下别人的控制台程序,我不能自己编写子进程。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:Biter 回复日期:2002-10-09 19:52:31
<br>内容:模板(STL)不知是否试过了我 的第二个问题,在此表示感谢!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -