2010-09-03 60 views
1

我有一個windows服務正在其服務main函數中創建一個命名管道。代碼段低於:如何通過其他程序訪問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機器上成功安裝和運行我的服務。
現在我如何使用其他程序訪問指定管道\\.\pipe\1stPipe

任何代碼片段或示例文章都會有幫助。

回答

1

我希望你不僅可以用CreateNamedPipeConnectNamedPipe。將Security and Access Rights設置爲管道(請參閱lpSecurityAttributes參數CreateNamedPipe)以便能夠與另一個用戶創建的管道進行通信也非常重要(如果您在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