2010-08-27 3 views
1

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

ответ

0

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

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

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

1

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

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

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

Теперь, получив GLE 5, обновил код snipet – Simsons

+0

Я работаю Win XP machine – Simsons

+0

Пробовал и DisconnectNamedPipe (lpszPipename); CloseHandle (hPipe); в конце кода перед возвратом 0; Такая же ошибка – Simsons

Смежные вопросы