Ⅰ VC 命名管道
可以在循环中用PeekNamedPipe()函数去判断是否有数据.
Ⅱ 非常怪异,VC++编写匿名管道就是获取不到一个特定命令行输出
64位程序?我这边没有可以运行的环境,运行就
该版本的 C:\Users\lenovo\Desktop\admin.exe 与您运行的 Windows 版本不兼容。请查看计算机的系统信息,了解是否需要 x86 (32 位)或 x64 (64 位)版本的程序,然后联系软件发布者。
这样,你把标准错误输出重定向。因为你在命令窗口看到的输出很可能是标准错误,不是标准输出
Ⅲ vc 匿名管道 出错
这么理解管道不正确。
应该是
1. 父向子管道写数据之后,关闭管道(写一个 FEOF)
2. 子收到数据完成后,再向父写数据,并关闭管道
3. 父收到数据后,显示,关闭所有句柄,结束
比如控制台命令C:\>
C:\>DIR 可以显示当前目录
C:\>DIR | MORE 逐页显示目录,就是DIR先产生数据,通过匿名管道送给MORE程序,MORE显示在控制台上,等待用户翻页,如果DIR完成,则MORE收到匿名管道FEOF数据,关闭管道并退出
这个命令里是先启动的DIR(父),后启动MORE(子),DIR其实已经一口气把所有内容都写入管道了,并且写完后关闭了管道。MORE取到数据,然后执行完毕,退出。
Ⅳ VC++ 管道传递消息问题(追加执行多条命令)
我想这些代码是你所需要的.
HANDLE hChildStdinRd = NULL, hChildStdinWr = NULL,
hChildStdoutRd = NULL, hChildStdoutWr = NULL;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
if (!CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &sa, 0))
{
TRACE1("Failed CreatePipe, %d\n", GetLastError());
return FALSE;
}
SetHandleInformation(hChildStdoutRd, HANDLE_FLAG_INHERIT, 0);
if (!CreatePipe(&hChildStdinRd, &hChildStdinWr, &sa, 0))
{
TRACE1("Failed CreatePipe, %d\n", GetLastError());
CloseHandle(hChildStdoutRd);
CloseHandle(hChildStdoutWr);
return FALSE;
}
SetHandleInformation(hChildStdinWr, HANDLE_FLAG_INHERIT, 0);
CString strCmdLine; //自己设置命令了
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.hStdError = hChildStdoutWr;
si.hStdOutput = hChildStdoutWr;
si.hStdInput = hChildStdinRd;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
BOOL bResult = CreateProcess(NULL,
strCmdLine.GetBuffer(strCmdLine.GetLength() + 1), NULL, NULL, TRUE,
0, NULL, NULL, &si, &pi);
strCmdLine.ReleaseBuffer();
if (!bResult)
{
CloseHandle(hChildStdinRd);
CloseHandle(hChildStdinWr);
CloseHandle(hChildStdoutRd);
CloseHandle(hChildStdoutWr);
return FALSE;
}
m_hChildProcess = pi.hProcess;
CloseHandle(pi.hThread);
CloseHandle(hChildStdinRd);
CloseHandle(hChildStdinWr);
CloseHandle(hChildStdoutWr);
do
{
bResult = ReadFile(hChildStdoutRd, pcRdBuff, BUFFER_SIZE, &dwReadBytes, NULL);
if (!bResult)
{
break;
}
if (dwReadBytes == 0)
{
break;
}
// dosomething
}while (1);
CloseHandle(hChildStdoutRd);
return TRUE;
Ⅳ VC++中,用管道实现进程间的通信是同步还是异步的
应该是异步吧
if(fork())
{
}
else
{
}
Ⅵ 关于VC中利用管道技术取得DOS或者命令行以及外部程序的执行结果
你这个while是可能会导致死循环的
if ( !ReadFile(hRead, buffer, 4095, &bytesRead, NULL) )
break;
因为ReadFile 在读到文件末尾时,有时候返回值并不为0;
正确的做法是判断bytesRead的值,当为0时,才表示读完文件了!
Ⅶ vc编程模拟cmd命令。求高手
1、用 EnumWindows找到这个telnet cmd窗口,hWndTelnet
2、用PostMessage 向 找到的窗口hWndTelnet,发向WM_CHAR消息。
Ⅷ VC如何利用匿名管道实现进程间通信
void CParentProcessDlg::OnOK()
{
SECURITY_ATTRIBUTES SecurityPipe;
SecurityPipe.bInheritHandle = TRUE;
SecurityPipe.lpSecurityDescriptor = NULL;
SecurityPipe.nLength = sizeof(SECURITY_ATTRIBUTES);
if (CreatePipe(&m_hRead,&m_hWrite,&SecurityPipe,0))
{
STARTUPINFO strinfo;
memset(&strinfo,0,sizeof(STARTUPINFO));
strinfo.cb = sizeof(STARTUPINFO); strinfo.hStdInput = m_hRead;
strinfo.dwFlags = STARTF_USESTDHANDLES;
strinfo.hStdOutput = m_hWrite; PROCESS_INFORMATION procInfo;
memset(&procInfo,0,sizeof(PROCESS_INFORMATION)); CreateProcess(NULL,"ChildProcess.exe",&SecurityPipe,&SecurityPipe,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&strinfo,&procInfo);
char data[]="明日科技";
unsigned long len;
if (! WriteFile(m_hWrite,data,8,&len,NULL))
{
MessageBox("数据写入失败");
}
}
else
MessageBox("匿名管道创建失败");
}
void CChildProcessDlg::OnButtonread()
{
HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
if (hInput != INVALID_HANDLE_VALUE )
{
char data[10];
memset(data,0,10);
unsigned long len;
int pos = ReadFile(hInput,data,10,&len,NULL);
m_Data = data;
UpdateData(FALSE);
CloseHandle(hInput);
}
}
Ⅸ VC 命名管道如何局域网通信
本地套接字链接如果正确的话,两台主机之间通信就不应该有问题,如果通信不成功,现考虑一下防火墙。