Что это значит, когда CreateNamedPipe возвращает 0xFFFFFFFF perror () говорит "NO ERROR"? - PullRequest
0 голосов
/ 29 января 2020

Я использую CreateNamedPipe. Он возвращает 0XFFFFFFFF, но когда я вызываю GetLastError и perror, я получаю «NO ERROR».

Я проверил https://docs.microsoft.com/en-us/windows/win32/ipc/multithreaded-pipe-server, и я кодировал очень похоже.

Я закодировал это с использованием приведенного здесь примера: { ссылка } = , и он говорит, что это означает ERROR_PATH_NOT_FOUND (3). Но мой адрес - "\\. \ Pipe \ pipe_com1. Обратите внимание, что StackOverflow, кажется, удаляет лишние косые черты, но вы увидите их в вставке моего кода.

Я следовал примеру здесь: Создать Именованный канал C ++ Windows, но я все еще получаю ошибку. Вот мой код:

//  Create a named pipe
//  It is used to test TcpToNamedPipe to be sore it it is addressing the named pipe

    #include <windows.h>
    #include <stdio.h>
    #include <process.h>

    char    ch;
    int main(int nargs,  char** argv)
    {
        if (nargs != 2)
        {
            printf("Usage pipe name is first arg\n");
            printf("press any key to exit ");
            scanf("%c", &ch);
            return -1;
        }

        char buffer[1024];
        HANDLE  hPipe;
        DWORD dwRead;
        sprintf(buffer, "\\\\.\\pipe\\%s", argv[1]);
        hPipe = CreateNamedPipe((LPCWSTR)buffer,
            PIPE_ACCESS_DUPLEX, 
            PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,    // FILE_FLAG_FIRST_PIPE_INSTANCE is not needed but forces CreateNamedPipe(..) to fail if the pipe already exists... 
            1,
            1024*16,
            1024*16,
            NMPWAIT_USE_DEFAULT_WAIT, 
            NULL);

        if (hPipe == INVALID_HANDLE_VALUE)
        {
            //int errorno = GetLastError();
            //printf("error creating pipe %d\n", errorno);
            perror("");
            printf("press any key to exit ");
            scanf("%c", &ch);
            return -1;
        }

        while (hPipe != INVALID_HANDLE_VALUE)
        {
            if (ConnectNamedPipe(hPipe, NULL) != FALSE)   // wait for someone to connect to the pipe
            {
                while (ReadFile(hPipe, buffer, sizeof(buffer) - 1, &dwRead, NULL) != FALSE)
                {
                    /* add terminating zero */
                    buffer[dwRead] = '\0';

                    /* do something with data in buffer */
                    printf("%s", buffer);
                }
            }

            DisconnectNamedPipe(hPipe);
        }

        return 0;
    }

Я предполагаю, что указатель на адрес может быть неправильным, и CreateNamedPipe не видит имя трубы правильно. Поэтому я использовал разборку и заметил, что адрес на самом деле является дальним указателем. Вот эта разборка:

00CA1A45  mov         esi,esp  
00CA1A47  push        0  
00CA1A49  push        0  
00CA1A4B  push        4000h  
00CA1A50  push        4000h  
00CA1A55  push        1  
00CA1A57  push        0  
00CA1A59  push        3  
00CA1A5B  lea         eax,[buffer]  
00CA1A61  push        eax  
00CA1A62  call        dword ptr [__imp__CreateNamedPipeW@32 (0CAB00Ch)] 

Может кто-нибудь заметить мою проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...