c++ - 尝试创建命名管道失败并显示 ERROR_IS_SUBSTED

标签 c++ visual-studio-2010 named-pipes getlasterror

我从 msdn 博客中获取了这段代码:

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

#define BUFSIZE 512

int _tmain(int argc, TCHAR *argv[]) 
{ 
   HANDLE hPipe; 
   LPTSTR lpvMessage=TEXT("Default message from client."); 
   TCHAR  chBuf[BUFSIZE]; 
   BOOL   fSuccess = FALSE; 
   DWORD  cbRead, cbToWrite, cbWritten, dwMode; 
   LPTSTR lpszPipename = TEXT("H:\\Users\\uname\\Documents\\fff.txt"); 

   if( argc > 1 )
      lpvMessage = argv[1];

// Try to open a named pipe; wait for it, if necessary. 

   while (1) 
   { 
      hPipe = CreateFile( 
         lpszPipename,   // pipe name 
         GENERIC_READ |  // read and write access 
         GENERIC_WRITE, 
         0,              // no sharing 
         NULL,           // default security attributes
         OPEN_ALWAYS,  // opens existing pipe 
         0,              // default attributes 
         NULL);          // no template file 

   // Break if the pipe handle is valid. 

      if (hPipe != INVALID_HANDLE_VALUE) 
         break; 

      // Exit if an error other than ERROR_PIPE_BUSY occurs. 

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

      // All pipe instances are busy, so wait for 20 seconds. 

      if ( ! WaitNamedPipe(lpszPipename, 20000)) 
      { 
         printf("Could not open pipe: 20 second wait timed out."); 
         return -1;
      } 
   } 

// The pipe connected; change to message-read mode. 

   dwMode = PIPE_READMODE_MESSAGE; 
   fSuccess = SetNamedPipeHandleState( 
      hPipe,    // pipe handle 
      &dwMode,  // new pipe mode 
      NULL,     // don't set maximum bytes 
      NULL);    // don't set maximum time 
   if ( ! fSuccess) 
   {
      _tprintf( TEXT("SetNamedPipeHandleState failed. GLE=%d\n"), GetLastError() ); 
      return -1;
   }

// Send a message to the pipe server. 

   cbToWrite = (lstrlen(lpvMessage)+1)*sizeof(TCHAR);
   _tprintf( TEXT("Sending %d byte message: \"%s\"\n"), cbToWrite, lpvMessage); 

   fSuccess = WriteFile( 
      hPipe,                  // pipe handle 
      lpvMessage,             // message 
      cbToWrite,              // message length 
      &cbWritten,             // bytes written 
      NULL);                  // not overlapped 

   if ( ! fSuccess) 
   {
      _tprintf( TEXT("WriteFile to pipe failed. GLE=%d\n"), GetLastError() ); 
      return -1;
   }

   printf("\nMessage sent to server, receiving reply as follows:\n");

   do 
   { 
   // Read from the pipe. 

      fSuccess = ReadFile( 
         hPipe,    // pipe handle 
         chBuf,    // buffer to receive reply 
         BUFSIZE*sizeof(TCHAR),  // size of buffer 
         &cbRead,  // number of bytes read 
         NULL);    // not overlapped 

      if ( ! fSuccess && GetLastError() != ERROR_MORE_DATA )
         break; 

      _tprintf( TEXT("\"%s\"\n"), chBuf ); 
   } while ( ! fSuccess);  // repeat loop if ERROR_MORE_DATA 

   if ( ! fSuccess)
   {
      _tprintf( TEXT("ReadFile from pipe failed. GLE=%d\n"), GetLastError() );
      return -1;
   }

   printf("\n<End of message, press ENTER to terminate connection and exit>");
   _getch();

   CloseHandle(hPipe); 

   return 0; 
}

我浏览了代码中使用的大部分功能的文档。我没有发现任何可能引起麻烦的操作。显然,在循环内打开文件是不应该存在的。但是我在编译代码(VS 2010 Ultimate)并运行它时,它失败了
ERROR_IS_SUBSTED 错误。 GetLastError 返回此错误的点在这里:

while (1) 
       { 
          hPipe = CreateFile( 
             lpszPipename,   // pipe name 
             GENERIC_READ |  // read and write access 
             GENERIC_WRITE, 
             0,              // no sharing 
             NULL,           // default security attributes
             OPEN_ALWAYS,  // opens existing pipe 
             0,              // default attributes 
             NULL);          // no template file 

我对 Windows 编程还是个新手,这些错误代码让我很困惑。 msdn此错误的文档说明 试图在已被替换的驱动器上使用 JOIN 或 SUBST 命令。 那么社区中的人可以吗

1.明确什么是ERROR_IS_SUBSTD? msdn给出的描述对我来说太神秘了。 :(

2.为什么会出现这个错误?

3.(有点偏离主题)我缺少 strace 实用程序,它在我的编程生涯中一直是我跟踪/纠正此类错误的救星。我们在 Windows 中有类似的东西吗?

最佳答案

除非您的 H 驱动器是网络共享,否则错误消息看起来像是胡说八道。但是,即使错误消息看起来像是胡说八道,您的管道名称也是如此。

要创建命名管道,请参阅此处的 MSDN: CreateNamedPipe

管道名必须类似于

"\\\\.\\pipe\\pipename"

关于c++ - 尝试创建命名管道失败并显示 ERROR_IS_SUBSTED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11200431/

相关文章:

c++ - 为什么我的 AVL 树排序算法比插入排序算法花费的时间更长?

c++ - 为 boost socket.connect 设置超时

c++ - 在 header 中转发声明 constexpr 函数

mysql - 连续从linux中的FIFO管道将数据插入mysql表数据

c - S_FIFO 未声明

c - 从管道(FIFO)读取然后比较字符串

c++ - 关于从内存中释放链表的析构函数的逻辑和范围的问题

windows - Visual Studio Express 2013 for Windows 和 Visual Studio Express 2013 for Windows Desktop 有什么区别?

visual-studio-2010 - 如何在我的解决方案中找到哪些项目引用了特定的 dll?

visual-studio-2010 - Visual Studio 11 Team Foundation Server Express Beta 是否支持 Visual Studio 2010