Новичок
Профиль
Группа: Участник
Сообщений: 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); } }
|
|