关于管道写失败,两者的通信不成功

jinweifu 2006-07-30 08:55:53
来了新问题 关于管道的问题 给了绝对的路径还是启动不了进程Child.exe

#include "stdafx.h"
#define _AFXDLL
#include "windows.h"

int WritePipe(HANDLE hWritePipe,char szRecvBuf[100]);
int ReadPipe(HANDLE hReadPipe);

void _tmain(int argc, _TCHAR* argv[])
{
HANDLE hReadPipe;
HANDLE hWritePipe;
HANDLE hEvent;
STARTUPINFO suif;
PROCESS_INFORMATION pi;
memset(&suif,0,sizeof(STARTUPINFO));
suif.cb=sizeof(STARTUPINFO);
suif.hStdError=GetStdHandle(STD_ERROR_HANDLE);
SECURITY_ATTRIBUTES sa;
sa.bInheritHandle=true;
sa.lpSecurityDescriptor=NULL;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);

if(!CreatePipe(&hReadPipe,&hWritePipe,&sa,sizeof(SECURITY_ATTRIBUTES)))
{
printf("Create pipe failed\n");
return ;
}
suif.hStdInput=hReadPipe;
suif.hStdOutput=hWritePipe;
printf("press any key to start child.exe");
getchar();
if(!CreateProcess(_T("C:\\Documents and Settings\\kampu\\My Documents\\Visual Studio 2005\Projects\\Sock\\debug\\Child.exe"),NULL,NULL,NULL,true,CREATE_NEW_CONSOLE,NULL,NULL,&suif,&pi))
{
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
printf("start process failed\n");
return ;
}

CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
printf("press any key to write pipe\n");
getchar();
char szSend[]="this is parent";
WritePipe(hWritePipe,szSend);
printf("press any key to read pipe\n");
getchar();
ReadPipe(hReadPipe);




return ;
}

int ReadPipe(HANDLE hReadPipe)
{
char szRecvBuf[100];
DWORD wRecv=0;
if(!ReadFile(hReadPipe,szRecvBuf,100,&wRecv,NULL))
{
printf("Read file failed\n");
return 0;
}
printf("%s\n",szRecvBuf);
return 1;
}
int WritePipe(HANDLE hWritePipe,char szRecvBuf[100])
{
DWORD wRecv=0;
if(!WriteFile(hWritePipe,szRecvBuf,(DWORD)strlen(szRecvBuf)+1,&wRecv,NULL))
{
printf("Write file failed\n");
return 0;
}
printf("Write pipe succeed;");
return 1;

}

子进程程序

// Child.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#define _AFXDLL
#include "windows.h"

int WritePipe(HANDLE hWritePipe,char szRecvBuf[100]);
int ReadPipe(HANDLE hReadPipe);
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hWritePipe;
HANDLE hReadPipe;
hReadPipe=GetStdHandle(STD_INPUT_HANDLE);
hWritePipe=GetStdHandle(STD_OUTPUT_HANDLE);
printf("please press any key to read pipe\n");
getchar();
ReadPipe(hReadPipe);
printf("please press any key to write pipe\n");
getchar();
char szSend[]="this is parent\n";
WritePipe(hWritePipe,szSend);


return 0;
}
int ReadPipe(HANDLE hReadPipe)
{
char szRecvBuf[100];
DWORD wRecv=0;
if(!ReadFile(hReadPipe,szRecvBuf,100,&wRecv,NULL))
{
printf("Read file failed\n");
return 0;
}
printf("%s\n",szRecvBuf);
return 1;
}
int WritePipe(HANDLE hWritePipe,char szRecvBuf[100])
{
DWORD wRecv=0;
if(!WriteFile(hWritePipe,szRecvBuf,(DWORD)strlen(szRecvBuf)+1,&wRecv,NULL))
{
printf("Write file failed\n");
return 0;
}
printf("Write pipe succeed;");
return 1;

}

子进程出现一些乱码,父进程没有反应。谁能帮忙调试一下?
...全文
301 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
artcpp 2006-11-18
  • 打赏
  • 举报
回复
//==========================管道开始================================
//#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;
}
jinweifu 2006-08-01
  • 打赏
  • 举报
回复
这个问题已经解决 粘贴急了点 能回答我题目的问题吗?
cenchure 2006-08-01
  • 打赏
  • 举报
回复
(_T("C:\\Documents and Settings\\kampu\\My Documents\\Visual Studio 2005\Projects\\Sock\\debug\\Child.exe"),

\projects 掉了个 \
winwinter 2006-08-01
  • 打赏
  • 举报
回复
友情UP
jinweifu 2006-08-01
  • 打赏
  • 举报
回复
顶上去
jinweifu 2006-07-31
  • 打赏
  • 举报
回复
谢谢 好冷清啊
CW_Wei 2006-07-30
  • 打赏
  • 举报
回复
up

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧