Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает функция ConnectNamedPipe 
:(
    Опции темы
sanches939
Дата 23.12.2019, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 23.12.2019

Репутация: нет
Всего: нет



Здравствуйте, очень нужна ваша помощь. Было создано приложение для работы с именованным каналом(код прикреплен). При тестировании выполнялся сначала первый пункт меню, потом второй, и вот при выполнении второго пункта функция 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");

PM MAIL   Вверх
xvr
Дата 23.12.2019, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1129 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.