Получение ошибки GLE=5 (отказано в доступе) при создании именованного канала

Я попытался создать именованный канал, но получил GLE 5 (ошибка отказа в доступе)

#include <windows.h> 
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include "iostream.h"

//#define PIPE_ACCESS_DUPLEX 0x00000003
//#define PIPE_ACCESS_INBOUND 0x00000001
//#define PIPE_ACCESS_OUTBOUND 0x00000002
#define BUFSIZE 512

int main()
{
    HANDLE hPipe;
    LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\mynamedpipe"); 
    hPipe=CreateNamedPipe(lpszPipename,PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,PIPE_UNLIMITED_INSTANCES,BUFSIZE,BUFSIZE,0,NULL);

    if (hPipe != INVALID_HANDLE_VALUE) 
        cout<<"Valid";


      if (GetLastError() != ERROR_PIPE_BUSY) 
      {
         printf( TEXT("Could not open pipe. GLE=%d\n"), GetLastError() ); 
         return -1;
      }

    return 0;
}

person Simsons    schedule 27.08.2010    source источник


Ответы (2)


lPipeName недействителен, вам нужно правильно экранировать символы '\', как в примере с msdn (см. здесь для получения подробной информации о различных кодах ошибок).

Я бы также использовал определения, а не шестнадцатеричные числа, канал, который я использую, объявлен с помощью:

hPipe = CreateNamedPipe( lpszPipename, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,  
                         PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 
                        PIPE_UNLIMITED_INSTANCES, BUFSIZE, BUFSIZE, 0, NULL);

Какой imo более читабелен.

Фрагмент кода MSDN предназначен для клиентской стороны. Сторона сервера создает канал с помощью CreateNamedPipe, клиентская сторона подключается к уже созданному каналу с помощью CreateFile.

РЕДАКТИРОВАТЬ: первые два абзаца раздела примечаний в CreatenamedPipe справочная страница описывает, почему вам может быть отказано в доступе. Предполагая, что это единственный экземпляр этого именованного канала, который вы создаете, проблема может заключаться в ваших разрешениях. У тебя Виста или Виндовс 7? Если это так, убедитесь, что вы работаете от имени администратора. В противном случае вам придется играть с вашими настройками, пока вы не сделаете все правильно.

PS: Вы вызываете DisconnectNamedPipe и CloseHandle, когда закончите с каналом? Я бы назвал их, даже если канал не был создан правильно.

person Patrick    schedule 27.08.2010
comment
Пробовал как DisconnectNamedPipe(lpszPipename); CloseHandle(hPipe); в конце кода перед возвратом 0; Та же ошибка - person Simsons; 27.08.2010

Ну, я много чего перепробовал с моей программой, но не смог понять, почему создание не удалось.

Я работал над VС++ 6.0. Затем я запустил свою Visual Studio 2008 и создал проект C++. Вставил Код. Скомпилировано. Получил ошибку:

Error   1   fatal error C1083: Cannot open include file: 'iostream.h': No such file or directory

прокомментировал #include "iostream.h".

Восстановите, и это сработало. Не очень уверен, почему это произошло, но сработало для меня. Пожалуйста, обновите, если вы узнали, почему это происходит, или есть решение.

person Simsons    schedule 30.08.2010