2010-08-27 52 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); 

哪個IMO是更具可讀性。

MSDN代碼片段用於客戶端。服務器端使用CreateNamedPipe創建管道,客戶端使用CreateFile連接到已經創建的管道。

編輯: CreatenamedPipe手冊頁的備註部分的前兩段描述了爲什麼您可能會拒絕訪問。假設這是這個命名管道的唯一實例,那麼您創建的問題可能是您的權限。你在Vista或Windows 7上?如果是這樣,請確保您以管理員身份運行。否則,你必須玩你的設置,直到你做對了。

PS:當你完成管道時,你是否調用了DisconnectNamedPipe和CloseHandle?即使管道沒有正確創建,我也會打電話給他們。

+0

現在越來越GLE 5錯誤,更新了代碼snipet – Simsons 2010-08-27 09:37:46

+0

我工作Win XP機器 – Simsons 2010-08-27 11:19:06

+0

試了兩個DisconnectNamedPipe(lpszPipename); CloseHandle的(hPipe);在代碼結束前返回0;同樣的錯誤 – Simsons 2010-08-27 11:37:05