Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Не работает функция ConnectNamedPipe


Автор: sanches939 23.12.2019, 01:25
Здравствуйте, очень нужна ваша помощь. Было создано приложение для работы с именованным каналом(код прикреплен). При тестировании выполнялся сначала первый пункт меню, потом второй, и вот при выполнении второго пункта функция ConnectNamedPipe возвращала код ошибки 6(ERROR_INVALID_HANDLE), при чем что странно, сначала при тестировании все работало, но после нескольких запусков перестала работать функция ConnectNamedPipe, функция CreateNamedPipe работает корректно. Перезагружал компьютер, переименовывал канал в коде, создавал новый проект - ничего не помогает. Вообще не знаю что делать, интернет весь перерыл, ничего не нашел. Помогите пожалуйста. В чем может быть проблема?
Код

#include <iostream>
#include <Windows.h>

using namespace std;


int menu()
{
    int choise = 0;
    cout << "1 - Create the Pipe" << endl;
    cout << "2 - Connect the Pipe" << endl;
    cout << "3 - Write to the Pipe" << endl;
    cout << "4 - Disconnect the Pipe" << endl;
    cout << "0 - Exit" << endl;
    cin >> choise;
    return choise;
}

int main() {

    setlocale(LC_ALL, "Russian");
    ///*
    
    HANDLE hPipe = NULL;
    OVERLAPPED overlapped;
    overlapped.hEvent = CreateEvent(NULL, true, false, NULL);
    overlapped.Offset = 0;
    overlapped.OffsetHigh = 0;
    char buffer[512];
    int choise = menu();
    while (choise != 0) {
        switch (choise)
        {
        case 1:
        {
            HANDLE hPipe = CreateNamedPipe("\\\\.\\pipe\\myPipe1", PIPE_ACCESS_OUTBOUND | FILE_FLAG_OVERLAPPED | WRITE_DAC, PIPE_TYPE_MESSAGE | PIPE_WAIT, 1, 512, 512, 0, NULL);
            if (hPipe != INVALID_HANDLE_VALUE) {
                cout << "Pipe was created\n";
            }
            else {
                cout << "Can't create the pipe\n";
                system("pause");
            }
            break;
        }
        case 2:
        {
            bool connected = ConnectNamedPipe(hPipe, NULL);
            if (connected)
            {
                cout << "Connected to the pipe\n";
            }
            else {
                DWORD connectedError = GetLastError();
                cout << connectedError;
            }
            //if (ConnectNamedPipe(hPipe, NULL)) {
            //    cout << "Connected to the pipe\n";
            //}
            //else {
            //    cout << "Can't connect the pipe\n";
            //}
            break;
        }
        case 3:
        {
            ZeroMemory(buffer, 0);
            cout << "Enter message: ";
            cin >> buffer;
            WriteFile(hPipe, buffer, strlen(buffer) + 1, NULL, &overlapped);
            WaitForSingleObject(overlapped.hEvent, INFINITE);
            cout << "Written\n";
            break;
        }
        case 4:
        {
            DisconnectNamedPipe(hPipe);
            CloseHandle(overlapped.hEvent);
        }
        }
        cout << "\n";
        choise = menu();
    }
    system("pause");

Автор: xvr 23.12.2019, 15:02
В 36 строке у вас объявляется локальная (в блоке) переменная hPipe, при этом весь остальной код работает с другой переменной - в 24 строке. И она всегда NULL. Так что ошибки вполне ожидаемы

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)