2016-11-09 5 views
1

Итак, я пытаюсь использовать Named Pipes для связи между сервером C# и клиентом C++ .dll, который я буду вводить. Мои именованные каналы отлично работают при использовании с консольным приложением C++, но когда я использую тот же метод в .dll, сервер и клиент подключаются нормально, но когда я пытаюсь использовать NamedPipeServerStream.Write(), мое приложение C# замораживается. Они оба x64, если это вообще имеет значение.Именованные каналы C# Сервер C++ .dll Клиент не работает?

Любые идеи относительно того, почему?

C# Сервер

Thread ServerThread; 
    private static NamedPipeServerStream _server; 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     ServerThread = new Thread(ServerThreadSub); 

     ServerThread.Start(); 
    } 

    void ServerThreadSub() 
    { 
     while (true) 
     { 
      _server = new NamedPipeServerStream("ConsolePipe", PipeDirection.Out, 1, PipeTransmissionMode.Message); 
      _server.WaitForConnection(); 
      do 
      { 
      } while (_server.IsConnected); 
      _server.Close(); 
     } 
    } 

    private void text_CurrentCommand_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Return) 
     { 
      if (text_CurrentCommand.Text != "") 
      { 
       if (_server.IsConnected) 
       { 
        try 
        { 
         byte[] buff = Encoding.UTF8.GetBytes(text_CurrentCommand.Text); 
         _server.Write(buff, 0, buff.Length); //Freezes here 
        } 
        catch 
        { 
         Log("Client Disconnected, Command Not Processed."); 
        } 
       } 
       else 
       { 
        Log("Command Not Processed. Client Not Connected."); 
       } 
      } 
      e.SuppressKeyPress = true; 
     } 
    } 

C++ Клиент

#define PIPE_NAME L"\\\\.\\pipe\\ConsolePipe" 
#define BUFF_SIZE 1024 

HANDLE hPipe; 

DWORD WINAPI Main(LPVOID threadArgs) 
{ 
    while (true) 
    { 
     do 
     { 
      Sleep(1000); 
      hPipe = CreateFile(PIPE_NAME, GENERIC_READ, 0, nullptr, OPEN_EXISTING, 0, nullptr); 
      if (hPipe == NULL || hPipe == INVALID_HANDLE_VALUE) DeleteFile(PIPE_NAME); 
     } while (hPipe == NULL || hPipe == INVALID_HANDLE_VALUE); 

     DWORD mode = PIPE_READMODE_MESSAGE; 

     SetNamedPipeHandleState(hPipe, &mode, nullptr, nullptr); 

     bool success = false; 
     DWORD read; 

     while (true) 
     { 
      char chBuff[BUFF_SIZE]; 
      success = ReadFile(hPipe, chBuff, (DWORD)strlen(chBuff), &read, nullptr); 
      if (success) 
      { 
      } 
      if (!success) break; 
     } 
    } 
    return 0; 
} 

Также другой запрос у меня есть, что это на самом деле не важно, есть ли способ, чтобы получить NamedPipeServerStream.IsConnected обновить без выполнения Read () или Write()?

Спасибо заранее с:

+3

Использование функции strlen (chBuff) в вызове ReadFile() неверно, что генерирует полностью случайное число. Вместо этого используйте BUFF_SIZE. –

+0

Хорошо, я попробую это c: – Semyel

+0

Это сработало, спасибо вам большое! c: – Semyel

ответ

0

Если вы создаете DLL, то я предлагаю вам использовать DllMain(), как точку входа, которая могла бы быть одной из главных причин ваша программа не работает

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL, // handle to DLL module 
    DWORD fdwReason,  // reason for calling function 
    LPVOID lpReserved) // reserved 
{ 
    // Perform actions based on the reason for calling. 
    switch(fdwReason) 
    { 
     case DLL_PROCESS_ATTACH: 
     // Initialize once for each new process. 
     // Return FALSE to fail DLL load. 
      break; 

     case DLL_THREAD_ATTACH: 
     // Do thread-specific initialization. 
      break; 

     case DLL_THREAD_DETACH: 
     // Do thread-specific cleanup. 
      break; 

     case DLL_PROCESS_DETACH: 
     // Perform any necessary cleanup. 
      break; 
    } 
    return TRUE; // Successful DLL_PROCESS_ATTACH. 
} 

Дополнительная информация https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx

+0

О, извините, я не поместил это в сообщение, потому что не имел никакого отношения к проблеме, все остальное работает нормально, только Write() разбивает его: c – Semyel