Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > повторное открытие Pipe


Автор: hawk3500 30.10.2012, 09:53
Доброго времени суток.
Кто знает скажите почему в этом коде
Код

HANDLE hPipe=0;
    hPipe=CreateNamedPipeA("\\\\.\\pipe\\ch1",PIPE_ACCESS_DUPLEX, 
        PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, n, n, 0, NULL);
    HANDLE hNamedPipeRW,hNamedPipeR;


    
    hNamedPipeRW = CreateFileA(
        "\\\\.\\pipe\\ch1", GENERIC_READ | GENERIC_WRITE,
        0, NULL, OPEN_EXISTING, 0, NULL);
    WrFiSt=WriteFile(hNamedPipeRW,ptr,n,&dwRet,NULL);
    CloseHandle(hNamedPipeRW);
    hNamedPipeR = CreateFileA(
        "\\\\.\\pipe\\ch1", GENERIC_READ,
        0, NULL, OPEN_EXISTING, 0, NULL);
CloseHandle(hPipe);



hNamedPipeR  = INVALID_HANDLE_VALUE?
Любое повторное открытие пайпа выдаёт ошибку...
Заранее благодарен.

Автор: feodorv 30.10.2012, 09:55
Цитата(hawk3500 @  30.10.2012,  10:53 Найти цитируемый пост)
Кто знает скажите почему

GetLastError() скажите, пожалуйста.

Добавлено через 1 минуту и 23 секунды
PS Эта тема - для http://forum.vingrad.ru/forum/c-c++system-programming-WinAPI.html smile 

Автор: hawk3500 30.10.2012, 09:59
GetLastError возвращает 0x000000e7
ERROR_PIPE_BUSY

Автор: feodorv 30.10.2012, 10:19
Цитата

A named pipe client uses the CreateFile function to open a handle to a named pipe. If the pipe exists but all of its instances are busy, CreateFile returns zero and the GetLastError function returns ERROR_PIPE_BUSY. When this happens, the named pipe client uses the WaitNamedPipe function to wait for an instance of the named pipe to become available. 


Вы бы создали бы новый экземпляр пайпа совместно с вызовом ConnectNamedPipe() в отдельном потоке. Тогда, глядишь, сработал бы второй вызов CreateFile.

ЗЫ CreateNamedPipe создаёт один экземпляр пайпа, который работает только с присоединившемся к нему клиентом. С другим он уже работать не может.

Автор: hawk3500 30.10.2012, 10:48
А можно поподробней?
Т.е. после записи в пайп я должен создать поток в которм должен повторить всё что было до этого?

Автор: feodorv 30.10.2012, 11:06
Да нет. Просто в одном потоке реализуете сервер, в другом - клиента. В одном и том же потоке и сервер, и клиент вряд ли получатся:
Код

// Сервер
for (;;) 

  hPipe = CreateNamedPipe( ... );

  if( hPipe == INVALID_HANDLE_VALUE ) ...

  if( ConnectNamedPipe(hPipe, NULL) == 0 && GetLastError() != ERROR_PIPE_CONNECTED )
  {
    CloseHandle( hPipe );
    continue;
  }

  // Pipe Read/Write (or new thread)

  CloseHandle( hPipe );
}
Код

// Клиент
hPipe = CreateFile( ... );
if( hPipe == INVALID_HANDLE_VALUE )
{
  if( GetLastError() != ERROR_PIPE_BUSY ) Panic();
  if( !WaitNamedPipe( ...) ) Panic();
}

// Pipe Read/Write

CloseHandle( hPipe );


В клиенте повторное открытие пайпа будет успешно только если сервер выполнит ConnectNamedPipe...

Автор: boostcoder 30.10.2012, 11:34
hawk3500, для чего рукоблудить? есть же замечательный, временем проверенный, http://www.boost.org/doc/libs/1_51_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.message_queue ;)

Автор: hawk3500 30.10.2012, 12:02
А рукоблудить приходиться так как хочу попробовать в LoadLibrary передать имя пайпа...

Автор: boostcoder 30.10.2012, 12:05
расскажи, для чего такое нужно? дико любопытно.

Автор: hawk3500 30.10.2012, 12:17
Есть набор DLL, каждая из которых представляет реализацию того или иного алгоритма(интерполяция, обработка HDLC и т.д.) так вот хотелось бы их пометить в один файл.Этакая единая база.
Что скажает?Можно загрузить DLL из pipe?

Автор: boostcoder 30.10.2012, 12:32
Цитата(hawk3500 @  30.10.2012,  12:17 Найти цитируемый пост)
Что скажает?

все равно не понял, для чего такое делать...

Автор: hawk3500 30.10.2012, 12:38
Дабы все файлы были в одном + так можно осуществить дополнительную защиту (ну из простого просто хранить в закриптованном виде, а при загрузке расшифровывать)

Автор: bems 31.10.2012, 13:37
Цитата(hawk3500 @  30.10.2012,  12:02 Найти цитируемый пост)
хочу попробовать в LoadLibrary передать имя пайпа

не выйдет, хотя бы потому что пайпы не маппятся на адреса как трушные файлы

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)