【问题标题】:How Can I access Windows Service Object by Another Programme如何通过另一个程序访问 Windows 服务对象
【发布时间】:2010-09-03 08:39:26
【问题描述】:

我有一个 Windows 服务,它在它的服务主函数中创建一个命名管道。代码sn-p如下:

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 机器上成功安装和运行我的服务。
现在如何使用另一个程序访问命名管道\\.\pipe\1stPipe

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

【问题讨论】:

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


    【解决方案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

    【讨论】:

      【解决方案2】:

      快速搜索得到以下结果:

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

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

      这些有帮助吗?

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

      【讨论】:

      • 不,我告诉 abt creatin 和命名管道的方法。但是我需要知道如何访问一个存在于窗口服务中的对象(现在它是一个 NamedPipe)。
      猜你喜欢
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 2012-04-08
      相关资源
      最近更新 更多