win32服务与管理进程如何通讯

saiyaman5 2009-11-10 03:46:55
我现在做一个win32服务程序,
另外还要做一个管理程序,用于控制与查看服务的运行状态
现在问题是这个管理程序如何与服务对接起来,也就是通讯
想问一下一般的方法是什么?通用的
...全文
121 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
还没淹死的鱼 2009-11-11
  • 打赏
  • 举报
回复
学习一下
「已注销」 2009-11-11
  • 打赏
  • 举报
回复
管道,文件,socket, ....,如果只是把服务运行的状态打印出来的话,当然还有最简单的,设置服务与桌面交付,服务发 WM_COPYDATA 给一个显示对话框显示运行状态。
paerxiushi 2009-11-11
  • 打赏
  • 举报
回复
采用匿名管道的做法是:
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;
}
oyljerry 2009-11-10
  • 打赏
  • 举报
回复
socket,rpc,COM等方式都可以...
prodiving 2009-11-10
  • 打赏
  • 举报
回复
是的,用pipe,我们都是这么干的
lxq301872 2009-11-10
  • 打赏
  • 举报
回复
en,好问题!
MoXiaoRab 2009-11-10
  • 打赏
  • 举报
回复
用管道。我们都是这么干的
winnuke 2009-11-10
  • 打赏
  • 举报
回复
内存映射文件。命名事件等。
JonathanS666 2009-11-10
  • 打赏
  • 举报
回复
在你的管理程序中定时调用OpenService 来查看服务是否运行

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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