2016-09-03 7 views
-1

パイプライン通信で自分のコードに実装しようとしています。 ビルドは成功しましたが、コードは機能しません。 私のパイプラインの通信コードは次のとおりです。私はこの問題の修正を試みたこのパイプライン通信コードで何が問題になっていますか?

int CTssPipeClient::Start(VOID) 
{ 
    m_uThreadId = 0; 
    m_hThread = (HANDLE)_beginthreadex(NULL, 0, ProcessPipe, LPVOID(this), 0, &m_uThreadId); 
    return 1; 
} 

VOID CTssPipeClient::Stop(VOID) 
{ 
    m_bRunning = FALSE; 
    if(m_hThread) 
    { 
     WaitForSingleObject(m_hThread, INFINITE); 
     CloseHandle(m_hThread); 
    } 
    if(m_hPipe) 
    { 
     CloseHandle(m_hPipe); 
    } 
} 

UINT CTssPipeClient::Run() 
{ 
    BOOL fSuccess; 
    DWORD dwMode; 
    LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\tssnamedpipe"); 

    m_vMsgList.clear(); 
    m_bRunning = TRUE; 
    // Try to open a named pipe; wait for it, if necessary. 
    while (m_bRunning) 
    { 
     m_hPipe = CreateFile( 
      lpszPipename, // pipe name 
      GENERIC_READ // read and write access 
      0,    // no sharing 
      NULL,   // default security attributes 
      OPEN_EXISTING, // opens existing pipe 
      0,    // default attributes 
      NULL);   // no template file 

     // Break if the pipe handle is valid. 
     if (m_hPipe == INVALID_HANDLE_VALUE) 
     { 
      Sleep(1000); 
      continue; 
     } 
     dwMode = PIPE_READMODE_MESSAGE; 
     fSuccess = SetNamedPipeHandleState( 
      m_hPipe, // pipe handle 
      &dwMode, // new pipe mode 
      NULL,  // don't set maximum bytes 
      NULL); // don't set maximum time 
     if (!fSuccess) 
     { 
      continue; 
     } 
     while(fSuccess) 
     { 
      if(m_vMsgList.size() > 0) 
      { 
       DWORD cbWritten; 
       // Send a message to the pipe server. 

       fSuccess = WriteFile( 
        m_hPipe,     // pipe handle 
        m_vMsgList[0].c_str(),     // message 
        (m_vMsgList[0].length() + 1)*sizeof(TCHAR), // message length 
        &cbWritten,    // bytes written 
        NULL);     // not overlapped 
       m_vMsgList.erase(m_vMsgList.begin()); 
       if (!fSuccess) 
       { 
        break; 
       } 
      } 
      Sleep(200); 
     } 
     CloseHandle(m_hPipe); 
    } 
    _endthreadex(0); 
    return 0; 
} 

DWORD CTssPipeClient::WriteMsg(LPCTSTR szMsg) 
{ 
    if(!m_bRunning) 
    { 
     Start(); 
    } 
    wstring wstr(szMsg); 
    m_vMsgList.push_back(wstr); 
    return 0; 
} 

。しかし、私は何が間違っているのか分からなかった? 私を助けてください。私はあなたの助けに感謝しています。

ありがとうございます。

+0

問題が何ですか。具体的にご記入のうえ、エラーメッセージ、または期待どおりに動作しないものを含めてください。 – Rakete1111

+0

正確には動作しません。より具体的に、あなたが何を期待しているのか、それを期待する理由を説明してください。 –

答えて

1

理由は簡単です。読み取りモードのみでファイルを開くためです。

次のように変更してください:

m_hPipe = CreateFile( 
      lpszPipename, // pipe name 
      GENERIC_READ | // read and write access 
      GENERIC_WRITE, 
      0,    // no sharing 
      NULL,   // default security attributes 
      OPEN_EXISTING, // opens existing pipe 
      0,    // default attributes 
      NULL);   // no template file 

私はそれが役に立てば幸い。

関連する問題