2012-06-26 2 views
0

Я взял этот код из блога MSDN:Попытка создать именованный канал неудачу с ERROR_IS_SUBSTED

#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; 
} 

я прошел документацию большинства функций, используемых в code.I не нашел что может вызвать проблемы. Очевидно, что открытие файла внутри цикла - это то, чего не должно быть. Но я компилирую код (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 

Я еще новичок в окнах программирования и эти коды ошибок путаете меня. msdn документация для этой ошибки говорит, что An attempt was made to use a JOIN or SUBST command on a drive that has already been substituted. Так может кто-то из сообщества пожалуйста

1.Clarify что ERROR_IS_SUBSTD? Описание, данное msdn, слишком загадочно для меня. :(

2.Why Я получаю эту ошибку?

3. (несколько не по теме) я пропускаю утилиту Strace, который был моим спасителем на протяжении всей моей жизни программирования в отслеживании/выпрямления таких ошибок. У нас есть что-то подобное в окнах?

ответ

2

сообщение об ошибке выглядит как случайный нонсенс, если ваш H диск не является сетевой ресурс. Но даже если сообщение об ошибке выглядит как случайный нонсенс, ваш pipename делает тоже самое.

Чтобы создать именованный канал , см. MSDN здесь: CreateNamedPipe

pipename должно быть что-то вроде

"\\\\.\\pipe\\pipename" 
+0

Так что, если я должен сделать тот или иной файл, как FIFO? похоже на то, что делает mkfifo (http://linux.die.net/man/3/mkfifo)? – bashrc

+0

Да. Подробная информация о API отличается от Windows и Linux, но они имеют общее представление о том, что такое значение в канале. –

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