我曾尝试创build一个命名pipe道,但得到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; }
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手册页的备注部分的前两个段落描述了为什么您可能会被拒绝访问。 假设这是这个命名管道的唯一的实例,你正在创建的问题可能是你的权限。 你在Vista或Windows 7上? 如果是这样,请确保您以管理员身份运行。 否则,你将不得不玩你的设置,直到你做对了。
PS:当你完成管道时,你是否调用了DisconnectNamedPipe和CloseHandle? 即使管道没有正确创建,我也会打电话给他们。
那么我用我的程序尝试了很多东西,但无法找出创建失败的原因。
我正在使用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"
。
重建和工作。 不知道为什么发生这种事,但为我工作。 如果您想知道为什么会发生这种情况,或者有解决方案,请更新。