Получение GLE = 5 (доступ запрещен) Ошибка при создании именованного канала - PullRequest
1 голос
/ 27 августа 2010

Я попытался создать именованный канал, но получил 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;
}

Ответы [ 2 ]

1 голос
/ 27 августа 2010

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);

Какой ИМО является более читабельным.

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

EDIT: Первые два абзаца раздела замечаний справочной страницы CreatenamedPipe описывают, почему вам может быть отказано в доступе. Предполагая, что это единственный экземпляр этого именованного канала, который вы создаете, проблема может быть в ваших разрешениях. Вы на Vista или Windows 7? Если это так, убедитесь, что вы работаете от имени администратора. В противном случае вам придется играть с вашими настройками, пока вы не сделаете это правильно.

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

0 голосов
/ 30 августа 2010

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

Я работал на VC ++ 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".

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

...