关于管道的问题! 有两个程序通过管道 pipe 进行数据通讯(匿名)管道,有什么办法知道他们的通信内容吗?可以不可以 遍历所有管道?并监视其通信内容? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你可以参考"Iarsn TaskInfo 6.x"这个软件, 它可以看到其它进程里的HANDLE, 包括pipe. //==========================管道开始================================ //#define BUFSIZE 22000 #define PIPE_TIMEOUT 1 const int BUFSIZE = sizeof(swfData)-33; DWORD dwThreadId; HANDLE hPipe, hThread; //LPTSTR lpszPipename = _T("\\\\.\\Pipe\\Test"); //* hPipe = CreateNamedPipe( g_lpszPipename, // pipe name PIPE_ACCESS_DUPLEX, // read/write access PIPE_TYPE_MESSAGE | // message type pipe PIPE_READMODE_MESSAGE | // message-read mode PIPE_WAIT, // blocking mode PIPE_UNLIMITED_INSTANCES, // max. instances BUFSIZE, // output buffer size BUFSIZE, // input buffer size PIPE_TIMEOUT, // client time-out NULL); // no security attribute //*/ //hPipe = CreateNamedPipe(_T("\\\\.\\Pipe\\Test"), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, 0, 0, 1000, NULL); // 创建命名管道 if (hPipe == INVALID_HANDLE_VALUE) { ::MessageBox (NULL, TEXT ("失败"), TEXT ("测试"), MB_TOPMOST); } else { // Create a thread for this client. hThread = CreateThread ( NULL, // no security attribute 0, // default stack size InstanceThread, //(LPTHREAD_START_ROUTINE)InstanceThread (LPVOID) hPipe, // thread parameter 0, // not suspended &dwThreadId); // returns thread ID if (hThread == NULL) ::MessageBox (NULL, TEXT ("hThread"), TEXT ("测试"), MB_TOPMOST); else CloseHandle(hThread); } if (ConnectNamedPipe(hPipe, NULL) == FALSE) // 等待客户机的连接 { ::MessageBox (NULL, TEXT ("连接失败"), TEXT ("测试"), MB_TOPMOST); CloseHandle(hPipe); // 关闭管道句柄 } else { ::MessageBox (NULL, TEXT ("连接成功"), TEXT ("测试"), MB_TOPMOST); } // 从管道读取数据 char buffer[22000]; // 数据缓存 DWORD ReadNum; if (ReadFile(hPipe, buffer, sizeof(swfData), &ReadNum, NULL) == FALSE) { CloseHandle(hPipe); // 关闭管道句柄 ::MessageBox (NULL, TEXT ("从管道读取数据失败!"), TEXT ("测试"), MB_TOPMOST); } else { //buffer[ReadNum] = _T('\0'); // 显示接收到的信息 ::MessageBox (NULL, TEXT ("从管道读取数据成功!"), TEXT ("测试"), MB_TOPMOST); //TCHAR szTemp[22000]; //wsprintf (szTemp, TEXT ("%s"), buffer); //memcpy(szTemp, buffer, sizeof(buffer)); //::MessageBox (NULL, szTemp, TEXT ("测试"), MB_TOPMOST); } //*/ while(!::WriteFile(hFile, buffer, BUFSIZE, &dwWritten, NULL)); ::FlushFileBuffers(hFile); ::CloseHandle(hFile); // 终止连接 if (DisconnectNamedPipe(hPipe) == FALSE) ::MessageBox (NULL, TEXT ("终止连接失败!"), TEXT ("测试"), MB_TOPMOST); else { ::MessageBox (NULL, TEXT ("终止连接成功!"), TEXT ("测试"), MB_TOPMOST); //CloseHandle(hPipe); // 关闭管道句柄 }// 管道客户机 unsigned longDWORD WINAPI CAboutDlg::InstanceThread(LPVOID lpvParam) { //TCHAR szMsg[] = _T("[测试数据由客户机发出]"); // 要发送的数据 DWORD WriteNum; // 发送的是数据长度 // 等待与服务器的连接 if (WaitNamedPipe(g_lpszPipename, NMPWAIT_WAIT_FOREVER) == FALSE) { //::MessageBox (NULL, TEXT ("等待连接失败!"), TEXT ("测试"), MB_TOPMOST); return 0; } // 打开已创建的管道句柄 HANDLE hPipe = CreateFile(g_lpszPipename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hPipe == INVALID_HANDLE_VALUE) { ::MessageBox (NULL, TEXT ("管道打开失败!"), TEXT ("测试"), MB_TOPMOST); return 0; } else { //::MessageBox (NULL, TEXT ("成功打开管道!"), TEXT ("测试"), MB_TOPMOST); } // 向管道写入数据 //WriteFile(hFile, &swfData[32], sizeof(swfData)-9, &dwWritten, NULL) //if (WriteFile(hPipe, szMsg, sizeof(szMsg), &WriteNum, NULL) == FALSE) if (WriteFile(hPipe,&swfData[32], sizeof(swfData)-9, &WriteNum, NULL) == FALSE) { ::MessageBox (NULL, TEXT ("数据写入管道失败!"), TEXT ("测试"), MB_TOPMOST); } else { ::MessageBox (NULL, TEXT ("数据成功写入管道!"), TEXT ("测试"), MB_TOPMOST); FlushFileBuffers(hPipe); //::ShellExecute(NULL, _T("open"), g_szFlashPlayer, g_lpszPipename, NULL, SW_SHOWMAXIMIZED); } CloseHandle(hPipe); // 关闭管道句柄 return 1;} 操作CListView基本就是GetListCtrl以后调用CListCtrl,那么作为View它还有什么其他的功能吗? WSASendTo的回调函数问题 数字图像处理VC++连接sql数据库的源码 国产的C++编译器,大家来看看吧。 关于CListCtrl控件的一个问题 穷人给所有的分问问有关多媒体定时器的问题......... 学过vc++的给我一点建议或是你的心得好吗?? 为什么不能读文件 ··求助··关于生成xls文件的问题,很急!!!!! 请问在VC++中如何打包 求助一个蜂鸣器的问题。 怎么使给tree添加的图标下次运行显示?
//#define BUFSIZE 22000
#define PIPE_TIMEOUT 1
const int BUFSIZE = sizeof(swfData)-33; DWORD dwThreadId;
HANDLE hPipe, hThread;
//LPTSTR lpszPipename = _T("\\\\.\\Pipe\\Test"); //*
hPipe = CreateNamedPipe(
g_lpszPipename, // pipe name
PIPE_ACCESS_DUPLEX, // read/write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_READMODE_MESSAGE | // message-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances
BUFSIZE, // output buffer size
BUFSIZE, // input buffer size
PIPE_TIMEOUT, // client time-out
NULL); // no security attribute
//*/
//hPipe = CreateNamedPipe(_T("\\\\.\\Pipe\\Test"), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, 0, 0, 1000, NULL); // 创建命名管道
if (hPipe == INVALID_HANDLE_VALUE)
{
::MessageBox (NULL, TEXT ("失败"), TEXT ("测试"), MB_TOPMOST);
}
else
{
// Create a thread for this client.
hThread = CreateThread (
NULL, // no security attribute
0, // default stack size
InstanceThread, //(LPTHREAD_START_ROUTINE)InstanceThread
(LPVOID) hPipe, // thread parameter
0, // not suspended
&dwThreadId); // returns thread ID if (hThread == NULL)
::MessageBox (NULL, TEXT ("hThread"), TEXT ("测试"), MB_TOPMOST);
else
CloseHandle(hThread);
} if (ConnectNamedPipe(hPipe, NULL) == FALSE) // 等待客户机的连接
{
::MessageBox (NULL, TEXT ("连接失败"), TEXT ("测试"), MB_TOPMOST);
CloseHandle(hPipe); // 关闭管道句柄
} else {
::MessageBox (NULL, TEXT ("连接成功"), TEXT ("测试"), MB_TOPMOST);
} // 从管道读取数据
char buffer[22000]; // 数据缓存
DWORD ReadNum;
if (ReadFile(hPipe, buffer, sizeof(swfData), &ReadNum, NULL) == FALSE)
{
CloseHandle(hPipe); // 关闭管道句柄
::MessageBox (NULL, TEXT ("从管道读取数据失败!"), TEXT ("测试"), MB_TOPMOST);
} else {
//buffer[ReadNum] = _T('\0'); // 显示接收到的信息
::MessageBox (NULL, TEXT ("从管道读取数据成功!"), TEXT ("测试"), MB_TOPMOST);
//TCHAR szTemp[22000];
//wsprintf (szTemp, TEXT ("%s"), buffer);
//memcpy(szTemp, buffer, sizeof(buffer));
//::MessageBox (NULL, szTemp, TEXT ("测试"), MB_TOPMOST);
}
//*/ while(!::WriteFile(hFile, buffer, BUFSIZE, &dwWritten, NULL));
::FlushFileBuffers(hFile);
::CloseHandle(hFile); // 终止连接
if (DisconnectNamedPipe(hPipe) == FALSE)
::MessageBox (NULL, TEXT ("终止连接失败!"), TEXT ("测试"), MB_TOPMOST);
else
{
::MessageBox (NULL, TEXT ("终止连接成功!"), TEXT ("测试"), MB_TOPMOST);
//CloseHandle(hPipe); // 关闭管道句柄
}
// 管道客户机 unsigned long
DWORD WINAPI CAboutDlg::InstanceThread(LPVOID lpvParam)
{
//TCHAR szMsg[] = _T("[测试数据由客户机发出]"); // 要发送的数据
DWORD WriteNum; // 发送的是数据长度
// 等待与服务器的连接
if (WaitNamedPipe(g_lpszPipename, NMPWAIT_WAIT_FOREVER) == FALSE)
{
//::MessageBox (NULL, TEXT ("等待连接失败!"), TEXT ("测试"), MB_TOPMOST);
return 0;
}
// 打开已创建的管道句柄
HANDLE hPipe = CreateFile(g_lpszPipename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hPipe == INVALID_HANDLE_VALUE)
{
::MessageBox (NULL, TEXT ("管道打开失败!"), TEXT ("测试"), MB_TOPMOST);
return 0;
} else {
//::MessageBox (NULL, TEXT ("成功打开管道!"), TEXT ("测试"), MB_TOPMOST);
}
// 向管道写入数据
//WriteFile(hFile, &swfData[32], sizeof(swfData)-9, &dwWritten, NULL)
//if (WriteFile(hPipe, szMsg, sizeof(szMsg), &WriteNum, NULL) == FALSE)
if (WriteFile(hPipe,&swfData[32], sizeof(swfData)-9, &WriteNum, NULL) == FALSE)
{
::MessageBox (NULL, TEXT ("数据写入管道失败!"), TEXT ("测试"), MB_TOPMOST);
} else {
::MessageBox (NULL, TEXT ("数据成功写入管道!"), TEXT ("测试"), MB_TOPMOST);
FlushFileBuffers(hPipe);
//::ShellExecute(NULL, _T("open"), g_szFlashPlayer, g_lpszPipename, NULL, SW_SHOWMAXIMIZED);
} CloseHandle(hPipe); // 关闭管道句柄 return 1;
}