代码之家  ›  专栏  ›  技术社区  ›  Simsons

如何通过其他程序访问Windows服务对象

  •  1
  • Simsons  · 技术社区  · 14 年前

    我有一个windows服务,它正在其服务主函数中创建一个命名管道。代码段如下:

    void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
    {
      DWORD status;
      DWORD specificError;
      m_ServiceStatus.dwServiceType = SERVICE_WIN32;
      m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
      m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
      m_ServiceStatus.dwWin32ExitCode = 0;
      m_ServiceStatus.dwServiceSpecificExitCode = 0;
      m_ServiceStatus.dwCheckPoint = 0;
      m_ServiceStatus.dwWaitHint = 0;
    
      m_ServiceStatusHandle = RegisterServiceCtrlHandler("myService", 
                                                ServiceCtrlHandler); 
      if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
      {
        return;
      }
      m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
      m_ServiceStatus.dwCheckPoint = 0;
      m_ServiceStatus.dwWaitHint = 0;
      if (!SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))
      {
      }
    
        CraeteNamedPipe();
    
         return;
    }
    

    CraeteNamedPipe 函数创建命名管道 \\.\pipe\1stPipe

    我能够在我的XP机器上成功地安装和运行我的服务。
    现在我怎样才能访问namedpipe \\管道\1管道

    任何代码片段或示例文章都是有用的。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Community CDub    8 年前

    我希望你不仅仅用 CreateNamedPipe 而且 ConnectNamedPipe Security and Access Rights 到管道(参见 lpSecurityAttributes 创建名称管道 )能够与另一个用户创建的管道进行通信(如果在windows服务内部创建管道并在服务外部使用,则为典型情况)。

    要从客户端连接到管道,可以使用 CreateFile CallNamedPipe 取决于 type mode Can you explain in more detail what's the difference between PIPE_READMODE_MESSAGE/PIPE_READMODE_BYTE? ).

    在消息类型管道中,通常使用 TransactNamedPipe (见 http://msdn.microsoft.com/en-us/library/aa365789.aspx ReadFile WriteFile .

    你可以找到不同的使用管道的例子 here