我现在做一个win32服务程序,
另外还要做一个管理程序,用于控制与查看服务的运行状态
现在问题是这个管理程序如何与服务对接起来,也就是通讯
想问一下一般的方法是什么?通用的
另外还要做一个管理程序,用于控制与查看服务的运行状态
现在问题是这个管理程序如何与服务对接起来,也就是通讯
想问一下一般的方法是什么?通用的
解决方案 »
- 树控件渐变效果//下面代码编译过,为什么不行?颜色是系统白色
- 我有一定的C和C++基础,想学Windows编程,先从MFC入手吗?
- 看下这段代码的DLL共享数据段能否实现共享
- 如何在程序一开始运行时,光标就在一edit box中闪烁
- 求助!得到CListBox的所有结点!
- Visual c++ 发布RELEASE版出现的问题
- 为什么位图按钮显示不了图像
- 为什么我的文件在别人的机子上不能运行?
- 求与这两本书配套的源代码!!up有分!!
- 救救我,我快要被辞退了,谁能给我这么个程序,当它运行其间所在的电脑上所有的文件变化都能得到,如更名,删除,创建,size,否则老板要要炒我蚰鱼了 [email protected]
- MFC MDI 单文档多视图的保存问题
- 传送文件名
http://www.vckbase.com/document/viewdoc/?id=1095http://www.vckbase.com/document/viewdoc/?id=1095http://www.vckbase.com/document/viewdoc/?id=283
1.每次调用CreatePipe时,只是建立了单方向上的通信,所以要想双工通信,就需要调用CreatePipe两次
2.两个管道句柄hChildOutWrite与hChildInRead是给子进程使用的,那么管道的另一端hChildInWrite与hChildOutRead是给主进程的
3.调用CreatePipe要指定管道能被子进程继承,这样子进程就能使用管道。
4.创建子进程时,需要将hChildOutWrite与hChildInRead传递给子进程的输入与输出缓冲区。
5.主进程的两个句柄需要进行复制,主进程就在这两个副本句柄上进行输入与输出。管道主进程的数据发送端:SECURITY_ATTRIBUTES sa;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle=TRUE;
sa.lpSecurityDescriptor=NULL; HANDLE hChildInWrite,hChildOutWrite,hChildInWrDup,hChildOutRdDup,hChildInRead,hChildOutRead;
HANDLE hStdWrite,hStdRead;
hStdWrite=GetStdHandle(STD_OUTPUT_HANDLE);
hStdRead=GetStdHandle(STD_INPUT_HANDLE); if(!CreatePipe(&hChildInRead,&hChildInWrite,&sa,0))
{
printf("创建管道失败!\n");
getchar();
return 1;
}
DuplicateHandle(GetCurrentProcess(),hChildInWrite,GetCurrentProcess(),&hChildInWrDup,0,FALSE,DUPLICATE_SAME_ACCESS);
if(!CreatePipe(&hChildOutRead,&hChildOutWrite,&sa,0))
{
printf("创建管道失败!\n");
getchar();
return 1;
}
DuplicateHandle(GetCurrentProcess(),hChildOutRead,GetCurrentProcess(),&hChildOutRdDup,0,FALSE,DUPLICATE_SAME_ACCESS); PROCESS_INFORMATION pi;
ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
STARTUPINFO si;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
si.hStdError=hChildOutWrite;
si.hStdOutput=hChildOutWrite;
si.hStdInput=hChildInRead;
si.lpTitle=_T("管道子进程");
si.dwFlags=STARTF_USESTDHANDLES;
if(!CreateProcess(_T("D:\\文档\\程序\\C++程序\\Windows编程\\PipeChild\\debug\\PipeChild.exe"),
NULL,
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi))
{
printf("创建子进程失败!\n");
getchar();
return 2;
}
for(int i=0;i <10;i++)
{ TCHAR szMess[1024]={0},szMessage[1024]={0};
DWORD dwRead,dwWrite;
_stprintf(szMess,_T("start:%d\n"),i);
WriteFile(hChildInWrDup,szMess,_tcslen(szMess)*sizeof(TCHAR),&dwWrite,NULL);
ReadFile(hChildOutRdDup,szMessage,sizeof(TCHAR)*1024,&dwRead,NULL);
DWORD dwLen=dwRead;
WriteFile(hStdWrite,szMessage,dwLen,&dwWrite,NULL);
_tprintf(szMessage);
Sleep(1000);
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(hChildInWrDup);
CloseHandle(hChildInWrite);
CloseHandle(hChildOutRdDup);
CloseHandle(hChildOutRead);
管道子进程数据接收端:#define BUFSIZE 4096
int _tmain(int argc, _TCHAR* argv[])
{
TCHAR chBuf[BUFSIZE]={0};
DWORD dwRead, dwWritten;
HANDLE hStdin, hStdout;
BOOL fSuccess; hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
hStdin = GetStdHandle(STD_INPUT_HANDLE); if ((hStdout == INVALID_HANDLE_VALUE) ||
(hStdin == INVALID_HANDLE_VALUE))
ExitProcess(1); for (;;)
{
// Read from standard input.
fSuccess = ReadFile(hStdin, chBuf, BUFSIZE*sizeof(TCHAR), &dwRead, NULL);
if (! fSuccess || dwRead == 0)
{
MessageBox(NULL,_T("创建管道失败"),_T("消息"),MB_OK);
break;
}
MessageBox(NULL,chBuf,_T("消息"),MB_OK);
// Write to standard output.
fSuccess = WriteFile(hStdout, chBuf, dwRead, &dwWritten, NULL);
if (! fSuccess)
break;
} return 0;
}