谁能提供一个c++管道使用实例
比如我调用一个函数 功能是在屏幕输出一个print语句helloworld
然后获取屏幕信息重定下到一个文本文件中
谁能给一个管道的使用例子 或者帮我实现一下上面的功能
很急 谢谢大家了
[解决办法]
HANDLE hStdIntput = GetStdHandle(STD_INPUT_HANDLE);//获得标准输入的句柄
if (hStdIntput == INVALID_HANDLE_VALUE)//如果获得不成共返回
return;
CHAR chBuf[BUFSIZE];
DWORD dwRead, dwWritten;
HANDLE hStdin, hStdout;
for (;;)
{
BOOL Success = ReadFile(hStdIntput, chBuf, BUFSIZE, &dwRead, NULL); //读取输入的字符
/*BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
);
Parameters
hFile
[in] Handle to the file to be read. The file handle must have been created with GENERIC_READ access to the file. This parameter cannot be a socket handle.
lpBuffer
[out] Pointer to the buffer that receives the data read from the file.
nNumberOfBytesToRead
[in] Number of bytes to be read from the file.
lpNumberOfBytesRead
[out] Pointer to the number of bytes read. ReadFile sets this value to zero before doing taking action or checking errors.
lpOverlapped
[in] Unsupported; set to NULL. */
[解决办法]
这是我以前写的一个东西,比较乱,也许对lz有用
CString sCommandLine;
char cWindowsDirectory[MAX_PATH];
char cCommandLine[MAX_PATH];
DWORD dwExitCode;
PROCESS_INFORMATION pi;
STARTUPINFO si;
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESTDHANDLES;
SECURITY_ATTRIBUTES sa = {sizeof(sa), NULL, TRUE};
HANDLE hStdOutRead, hStdOutWrite;
CreatePipe(&hStdOutRead, &hStdOutWrite, &sa, 0); //重点
si.hStdOutput = hStdOutWrite;
si.hStdError = hStdOutWrite;
sCommandLine = "c:/xxx/bin/xxx.exe ";
::strcpy(cCommandLine, sCommandLine);
BOOL ret = CreateProcess(NULL,
cCommandLine,
&sa,
&sa,
TRUE,
CREATE_NO_WINDOW,
NULL,
NULL,
&si,
&pi);
if (ret)
{
CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess, INFINITE);
GetExitCodeProcess(pi.hProcess, &dwExitCode);
CloseHandle(pi.hProcess);
}
char buffer[1000];
DWORD length = 1000;
memset(buffer, 0, 1000);
ReadFile(hStdOutRead,buffer,length,&length,NULL); // 重点
CloseHandle(hStdOutWrite);
CloseHandle(hStdOutRead);
[解决办法]
晕好久没写这些了,改了改这样更安全些
// 先保存标准输入流和标准错误流, 1 号流, 2 号流
int old_out = dup(1);
int old_err = dup(2);
// 重定向标准输出流和错误流到文件
FILE* ferr = fopen( "D:\\err.txt ", "w ");
dup2(fileno(ferr), 1);
dup2(fileno(ferr), 2);
// 把你那个函数放在这里!!!!!!!////////////////////////////////////////
cout < < "这些是你输入到文件的信息 " < <endl;
/////////////////////////////////////////////////////////////////////
fclose(ferr);
// 恢复标准输入流和错误流
dup2(old_out, 1);
dup2(old_err, 2);
cout < < "恢复后的信息 " < <endl;