Ⅰ 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 命名管道如何區域網通信
本地套接字鏈接如果正確的話,兩台主機之間通信就不應該有問題,如果通信不成功,現考慮一下防火牆。