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

时间:2010-09-03 08:39:26

标签: c++ windows visual-c++ windows-services named-pipes

我有一个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 \\.\pipe\1stPipe

任何代码段或示例文章都会有所帮助。

2 个答案:

答案 0 :(得分:1)

我希望您不仅可以使用CreateNamedPipe,还可以使用ConnectNamedPipe。将Security and Access Rights设置为管道(请参阅CreateNamedPipelpSecurityAttributes参数)以便能够与另一个用户创建的管道进行通信(如果您创建管道的典型情况)也非常重要在Windows服务内部并在服务之外使用。)

要从客户端连接到管道,可以使用CreateFileCallNamedPipe取决于type mode(另请参阅Can you explain in more detail what's the difference between PIPE_READMODE_MESSAGE/PIPE_READMODE_BYTE?)。

在消息类型管道中,通常使用CallNamedPipeTransactNamedPipe(请参阅http://msdn.microsoft.com/en-us/library/aa365789.aspx作为示例)。在字节类型管道中,使用关于ReadFileWriteFile的标准读/写文件操作。

使用管道的不同示例,您可以找到here

答案 1 :(得分:0)

快速搜索得到了这些结果:

  1. http://ist.marshall.edu/ist480acp/namedpipes.html

  2. http://www.codeguru.com/cpp/w-p/system/sharedmemory/article.php/c5771

  3. 那些帮助吗?

    *(我只看了一眼,没有管道经验)