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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Anonymous pipes and EditBox 
:(
    Опции темы
kmsboy
  Дата 5.9.2012, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Прошу помощи.
Просьба помочь в создании приложения с использованием исключительно winapi.
Окно c EditBox порождает дочерний процесс (такое же приложение с EditBox)
При вводе/удаление символов с родительском EditBox они передаются в дочерний EditBox через анонимные канал только в одну сторону от родительского процесса к дочернему.
У меня получилось написать окно с EditBox, а так же ловить то, что вводиться в EditBox.
Язык я не сильно знаю, что английский, что и сам язык программирования.

Читал тут
http://msdn.microsoft.com/en-us/library/wi...9(v=vs.85).aspx
Понял очень слабо если честно.

Я понимаю, что нужно создать несколько функций типа:
void CreateAPipe(void); //тут создаётся анонимный канал и запускает дочерний процесс + передаться ему хандлер
void CloseAPipe(void); // тут закрытие хандлеров по окончание работы с программой
void WriteToPipe(void); // а тут запись в анонимный канал с передачей события на чтение в дочернем процесс и поместить эту функцию в событие WM_COMMAND

Но как реализовать, если честно не сильно соображаю.
Если есть где почитать внятно и на русском, а так же за любую помощь буду благодарен.


Код родительского процесса:
Код

#include <windows.h>
#define ID_EDIT_BOX 1
#define BUFSIZE 4096
// ? ---
void CreateAPipe(void);
void CloseAPipe(void);
void WriteToPipe(void);
void ReadFromPipe(void);
//---

char srtEditBox[BUFSIZE];
HINSTANCE hInst;
HWND mainWindow,editBox,labelBox;
HANDLE hEnableRead;
// для синхронизации обмена данными
char lpszEnableRead[] = "EnableRead";
STARTUPINFO si;
PROCESS_INFORMATION pi;
HANDLE hWritePipe, hReadPipe;
SECURITY_ATTRIBUTES sa;
const char g_szClassName[] = "main";
//============================
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_COMMAND:
        if(HIWORD(wParam) == EN_CHANGE)
        {
            GetDlgItemText(mainWindow, ID_EDIT_BOX, srtEditBox, BUFSIZE);
            MessageBox(NULL, srtEditBox, "Title", MB_ICONINFORMATION | MB_OK);
            SetFocus(editBox);
        }
        break;
        case WM_CLOSE:
        CloseAPipe();
        DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
        CloseAPipe();
        PostQuitMessage(0);
        break;
        default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
//============================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    HFONT fnt;
    MSG Msg;
    hInst = hInstance;
    // ? Step 1: Registering the Window Class
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    wc.lpfnWndProc  = WndProc;
    wc.cbClsExtra = 0;
    wc.hInstance = hInst;
    wc.cbWndExtra = 0;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor  = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = g_szClassName;
    wc.hIconSm  = LoadIcon(NULL, IDI_APPLICATION);
    // ?
    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!",MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }
    // ?
    mainWindow = CreateWindowEx(WS_EX_CLIENTEDGE,g_szClassName,"Сервер | Васильев А.Н. | Вариант #6",WS_MINIMIZEBOX|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_CAPTION|WS_BORDER|WS_SYSMENU,CW_USEDEFAULT, CW_USEDEFAULT, 355, 60,NULL, NULL, hInstance, NULL);
    labelBox = CreateWindowEx(0, "STATIC", "Введите текст", ES_LEFT|WS_VISIBLE|WS_CHILD, 5, 5, 100, 20, mainWindow,NULL, hInst, NULL);
    editBox = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", ES_CENTER|ES_UPPERCASE|WS_VISIBLE|WS_CHILD|WS_TABSTOP, 105, 5, 240, 20, mainWindow,(HMENU) ID_EDIT_BOX, hInst, NULL);
    ShowWindow(mainWindow, SW_SHOW);
    fnt = CreateFont(13,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE, "Tahoma");
    SendMessage(labelBox, WM_SETFONT, (WPARAM)fnt, 0);
    SendMessage(editBox, WM_SETFONT, (WPARAM)fnt, 0);
    //?
    CreateAPipe();
    SetFocus(editBox);
    if(mainWindow == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }
    ShowWindow(mainWindow, nCmdShow);
    UpdateWindow(mainWindow);
    // Step 3: The Message Loop
    while(GetMessage(&Msg, NULL, 0, 0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}
//============================
void CreateAPipe()
{
    char lpszComLine[80];
    // для командной строки
    // создаем событие для синхронизации обмена данными
    hEnableRead = CreateEvent(NULL, FALSE, FALSE, lpszEnableRead);
    // устанавливает атрибуты защиты канала
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = NULL;
    // защита по умолчанию
    sa.bInheritHandle = TRUE;
    // дескрипторы наследуемые
    // создаем анонимный канал
    if(!CreatePipe(
    &hReadPipe, // дескриптор для чтения
    &hWritePipe, // дескриптор для записи
    &sa,  // атрибуты защиты по умолчанию, дескрипторы наследуемые
    0)) // размер буфера по умолчанию
    {
        MessageBox(NULL, "Create pipe failed.", "", MB_ICONERROR | MB_OK);
    }
    // устанавливаем атрибуты нового процесса
    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb = sizeof(STARTUPINFO);
    // формируем командеую строку
    wsprintf(lpszComLine, "C:\\Client.exe %d %d", (int)hReadPipe);
    // запускаем новый консольный процесс
    if (!CreateProcess(
    NULL, // имя процесса
    lpszComLine,  // командная строка
    NULL, // атрибуты защиты процесса по умолчанию
    NULL, // атрибуты защиты первичного потока по умолчанию
    TRUE, // наследуемые дескрипторы текущего процесса
    // наследуются новым процессом
    CREATE_NEW_CONSOLE, // новая консоль
    NULL, // используем среду окружения процесса предка
    NULL, // текущий диск и каталог, как и в процессе предке
    &si, // вид главного окна - по умолчанию
    &pi  // здесь будут дескрипторы и идентификаторы
    // нового процесса и его первичного потока
    ))
    {
        MessageBox(NULL, "Create process failed.", "", MB_ICONERROR | MB_OK);
    }
    // закрываем дескрипторы нового процесса
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
}
//============================
void CloseAPipe()
{
    // закрываем дескрипторы канала
    CloseHandle(hReadPipe);
    CloseHandle(hWritePipe);
    CloseHandle(hEnableRead);
}
//============================
void WriteToPipe(void)
{
    DWORD dwBytesWritten;
    BOOL bSuccess = FALSE;
    for (;;)
    {
        bSuccess = WriteFile(hWritePipe,srtEditBox,sizeof(srtEditBox),&dwBytesWritten,NULL);
        if ( ! bSuccess ) break;
        MessageBox(NULL, srtEditBox, "WriteToPipe", MB_ICONINFORMATION | MB_OK);
    }
}



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


Эксперт
****


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

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



На первый взгляд все правильно у вас написанно, кроме WriteToPipe
Вам нужно вызов WriteFile(hWritePipe,...) поместить после строки 30. И sizeof(srtEditBox) заменить на strlen(srtEditBox)+1

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.

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


 




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


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

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