我现在做一个win32服务程序,
另外还要做一个管理程序,用于控制与查看服务的运行状态
现在问题是这个管理程序如何与服务对接起来,也就是通讯
想问一下一般的方法是什么?通用的

解决方案 »

  1.   

    http://www.vckbase.com/document/viewdoc/?id=1738
    http://www.vckbase.com/document/viewdoc/?id=1095http://www.vckbase.com/document/viewdoc/?id=1095http://www.vckbase.com/document/viewdoc/?id=283
      

  2.   

    在你的管理程序中定时调用OpenService 来查看服务是否运行
      

  3.   

    http://topic.csdn.net/u/20091106/11/4c149c72-59e4-482d-ad62-d6486b035a8e.html
      

  4.   

    是的,用pipe,我们都是这么干的
      

  5.   

    socket,rpc,COM等方式都可以...
      

  6.   

    管道,文件,socket, ....,如果只是把服务运行的状态打印出来的话,当然还有最简单的,设置服务与桌面交付,服务发 WM_COPYDATA 给一个显示对话框显示运行状态。
      

  7.   

    采用匿名管道的做法是:
    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;