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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись в анонимный канал 
:(
    Опции темы
littlegreg
Дата 4.4.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет, только начинаю изучать WinAPI и столкнулся с проблемой при записи в анонимный канал, данные в него не записываются, помогите исправить ошибку.

клиент
Код

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

int main(int argc, char *argv[])
{
    HANDLE hWritePipe;

    hWritePipe = (HANDLE)atoi(argv[1]);
    //wait for command to start write into anonymous pipe
    _cputs("Press any key to start communication.\n");
    _getch();
    //write into AP
    for (int i = 0; i < 10; i++)
    {
        DWORD dwBytesWritten;
        if (!WriteFile(hWritePipe, &i, sizeof(i), &dwBytesWritten, NULL))
        {
            _cputs("Write to file failed.\n");
            _cputs("Press any key to finish.\n");
            _getch();
            return GetLastError();

        }
        _cprintf("The number %d is written to the pipe.\n", i);
        Sleep(500);
    }
    //close pipe descriptor
    CloseHandle(hWritePipe);

    _cputs("The process finished writing to the pipe.\n");
    _cputs("Press any key to exit.\n");
    _getch();

    return 0;
}


сервер
Код

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

int main()
{
    char lpszComLine[80];   //for comline

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    HANDLE hWritePipe, hReadPipe, hInheritWritePipe;

    //create anonymous pipe
    if (!CreatePipe(
                    &hReadPipe, //descriptor for read
                    &hWritePipe,    //descriptor for write
                    NULL,   //security attributes by default
                            //hReadPipe and hWritePipe unheritable
                    0)) //buffer size by default
    {
        _cputs("Create pipe failed.\n");
        _cputs("Press any key to finish.\n");
        _getch();
        return GetLastError();
    }
    else _cputs("Pipe created succesfully.\n");
    //create inheritable replicate of hWritePipe
    if (!DuplicateHandle(
                         GetCurrentProcess(),   //current process descriptor
                         hWritePipe,    //initial pipe descriptor
                         GetCurrentProcess(),
                         &hInheritWritePipe,    //pipe new descriptor
                         0,
                         TRUE,  //new descriptor is inheritable
                         DUPLICATE_SAME_ACCESS))    //access unchanged
    {
        _cputs("Duplicate handle failed.\n");
        _cputs("Press any key to finish.\n");
        _getch();
        return GetLastError();
    }
    else _cputs("Duplicate created succesfully.\n");
    //close unnecessary descriptor
    CloseHandle(hWritePipe);
    //set attributes for new descriptor
    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);
    //form comline
    wsprintf(lpszComLine, "D:\\Code\\Client.exe %d",
             (int)hInheritWritePipe);
    //launch new console process
    if (!CreateProcess(
                       NULL, //process name
                       lpszComLine, //com line
                       NULL,    //sec attrs by default
                       NULL,    //sec attrs of primary thread by default
                       TRUE,    //inheritable descriptors of current process
                                //are inherited by new process
                       CREATE_NEW_CONSOLE,
                       NULL,   //use environment of process-ancestor
                       NULL,    //current disk and directory
                       &si,     //main window look by default
                       &pi      //here will be descriptors and identificators
                                //of new process and its primary descendant
                                ))
    {
        _cputs("Create process failed.\n");
        _cputs("Press any key to finish.\n");
        _getch();
        return GetLastError();
    }
    else _cputs("Process created succesfully.\n");
    //close descriptors of new process
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    //close unnecessary descriptor of pipe
    //read from anonymous pipe
    for (int i = 0; i < 10; i++)
    {
        int nData;
        DWORD dwBytesRead;
        if (!ReadFile(hReadPipe, &nData, sizeof(nData), &dwBytesRead, NULL))
        {
            _cputs("Read from the pipe failed.\n");
            _cputs("Press any key to finish.\n");
            _getch();
            return GetLastError();
        }
        _cprintf("The number %d is read from the pipe.\n", nData);
    }
    //close pipe descriptor
    CloseHandle(hReadPipe);

    _cputs("The process finished reading from the pipe.\n");
    _cputs("Press any key to exit.\n");
    _getch();

    return 0;
}

PM MAIL   Вверх
littlegreg
Дата 4.4.2011, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



если подставлять другой буфер в WriteFile и ReadFile то все работает, но как мне при считывании получить те же значения, что я записывал.

Это сообщение отредактировал(а) littlegreg - 4.4.2011, 12:23
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.1020 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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