Anonymous Pipes And Editbox

kmsboy

New member
25.11.2008
2
0
#1
Прошу помощи.
Просьба помочь в создании приложения с использованием исключительно 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

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


Код родительского процесса:
C++:
#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_BOR
DER|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);
}
}