#include "Main.h" //#define MAX_VALUE_LEN 16384 //#define MAX_PATH_SIZE 260 //#define MAX_COUNT 1000 //MSG Msg;//Структура Msg типа MSG для получения сообщений Windows //------------------------------------------------------------------------------------- /*Главная функция WinMaln*/ const int iHeightEdit=20; TCHAR szFileName[260]; OPENFILENAME ofn; //BOOL flag; HANDLE s_hFileMap; HWND hWndMain; HWND hButExit,hButClear; HWND hListBox,hListBoxErr; HWND hButOpen,hButCreateMap,hButOpenMap,hButCloseMap; HWND hEditData; TCHAR lpProcName[256]=TEXT(""); wchar_t pszStrPID[256],szBufErr[256]; //HANDLE hFile; int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpCmd, int nShow) { //------------------------------------------------------------------------------------- hInstance=hInst; WNDCLASSEX wc;//Структура we типа WNDCLASS для задания характеристик окна static LPCTSTR szClassName = TEXT("MainLab5Window");//Произвольное имя класса главного окна static LPCTSTR szTitle = TEXT("Л.р. №6 - Межпроцессное взаимодействие");//заголовок окна /*Зарегистрируем класс главного окна*/ ZeroMemory(&wc,sizeof(wc));//Обнуление всех членов структуры wс wc.cbSize = sizeof(wc); // Set structure size wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc=WndProc; // Определяем оконную процедуру для главного окна wc.hInstance=hInst;//Дескриптор приложения wc.hIcon = LoadIcon(0, IDI_APPLICATION);//Стандартная пиктограмма wc.hCursor=LoadCursor(NULL,IDC_ARROW);//Стандартный курсор мыши char ID_MAINMENU[10] = "menu? o_0"; wc.hbrBackground=CreateSolidBrush(GetSysColor(COLOR_BTNFACE));// системный цвет рабочий области окна wc.lpszMenuName=(LPCWSTR)ID_MAINMENU; wc.lpszClassName=szClassName;//Имя класса окна RegisterClassEx(&wc);//Вызов функции Windows регистрации класса окна //Создадим главное окно по центру экрана и сделаем его видимым hWndMain=CreateWindow(szClassName, szTitle, WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_THICKFRAME,0,0,400,400,HWND_DESKTOP,NULL,hInst,NULL);//Родитель, меню, другие параметры RECT rc,rcMain; HWND hwndDesktop = GetDesktopWindow(); GetWindowRect(hwndDesktop, &rc); GetWindowRect(hWndMain, &rcMain); SetWindowPos(hWndMain, HWND_TOP, (rc.right-rc.left-rcMain.right)/2, (rc.bottom-rc.top-rcMain.bottom)/2, 0, 0, SWP_NOSIZE); ShowWindow(hWndMain,SW_SHOWNORMAL);//Вызов функции Windows показа окна /*Организуем цикл обнаружения сообщений*/ while(GetMessage(&Msg,NULL,0,0)) {// Если есть сообщение, передать его нам TranslateMessage(&Msg); DispatchMessage(&Msg);}//и вызвать оконную процедуру WndProc return 0;//После выхода из цикла вернуться в Windows }//Конец функции WinMain LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){ switch(msg){ HANDLE_MSG (hwnd, WM_CREATE, OnCreate); HANDLE_MSG (hwnd, WM_COMMAND, OnCommand); //HANDLE_MSG(hwnd,WM_PAINT,OnPaint); //HANDLE_MSG (hwnd, WM_DESTROY, OnDestroy); //HANDLE_MSG (hwnd, WM_NOTIFY, OnNotify); default: //B случае всех остальных сообщений Windows обработка return(DefWindowProc(hwnd,msg,wParam,lParam)) ; //их по умолчанию }//Конец оператора switch }//Конец функции WndProc bool OnCreate (HWND hwnd, LPCREATESTRUCT){ //------------------------------------------------------------------------------------- TCHAR ButExit[]=TEXT(" Exit "); RECT Rect; GetClientRect(hwnd,&Rect); hButExit=CreateWindow(TEXT("BUTTON"),NULL,WS_CHILD|WS_VISIBLE|SS_CENTER,Rect.right- Rect.left-105,Rect.top+300+iHeightEdit,(int)(1,5*iHeightEdit),iHeightEdit ,hwnd,NULL,hInstance,NULL); SendMessage(hButExit,WM_SETTEXT, 0, (LPARAM)(LPCSTR)ButExit); hButClear=CreateWindow(TEXT("BUTTON"),NULL,WS_CHILD|WS_VISIBLE|SS_CENTER,Rect.right- Rect.left-210,Rect.top+300+iHeightEdit,(int)(1,5*iHeightEdit),iHeightEdit ,hwnd,NULL,hInstance,NULL); SendMessage(hButClear,WM_SETTEXT, 0, (LPARAM)(LPCSTR)TEXT("Clear")); //hButOpen=CreateWindow(TEXT("BUTTON"),NULL,WS_CHILD|WS_VISIBLE|SS_CENTER,Rect.right- Rect.left-780,Rect.top+5+iHeightEdit,(int)(6*iHeightEdit),iHeightEdit ,hwnd,NULL,hInstance,NULL); //SendMessage(hButOpen,WM_SETTEXT, 0, (LPARAM)(LPCSTR)TEXT("Open")); hButCreateMap=CreateWindow(TEXT("BUTTON"),NULL,WS_CHILD|WS_VISIBLE|SS_CENTER,Rect.right- Rect.left-350,Rect.top+50+iHeightEdit,(int)(11*iHeightEdit),iHeightEdit ,hwnd,NULL,hInstance,NULL); SendMessage(hButCreateMap,WM_SETTEXT, 0, (LPARAM)(LPCSTR)TEXT("Create Mapping Of Data")); hButOpenMap=CreateWindow(TEXT("BUTTON"),NULL,WS_CHILD|WS_VISIBLE|SS_CENTER,Rect.right- Rect.left-350,Rect.top+80+iHeightEdit,(int)(11*iHeightEdit),iHeightEdit ,hwnd,NULL,hInstance,NULL); SendMessage(hButOpenMap,WM_SETTEXT, 0, (LPARAM)(LPCSTR)TEXT("Open Mapping Of Data")); hButCloseMap=CreateWindow(TEXT("BUTTON"),NULL,WS_CHILD|WS_VISIBLE|SS_CENTER,Rect.right- Rect.left-350,Rect.top+110+iHeightEdit,(int)(11*iHeightEdit),iHeightEdit ,hwnd,NULL,hInstance,NULL); SendMessage(hButCloseMap,WM_SETTEXT, 0, (LPARAM)(LPCSTR)TEXT("Close Mapping Of Data")); hEditData=CreateWindow(TEXT("EDIT"),NULL,WS_CHILD|WS_VISIBLE|SS_LEFT ,(int)(Rect.left+25),(int)(Rect.top+30),(int)(Rect.right- Rect.left-60),20,hwnd,NULL,hInstance,NULL); //HWND hTotalOfBytes=CreateWindow(TEXT("STATIC"),NULL,WS_CHILD|WS_VISIBLE|SS_LEFT ,(int)(Rect.left+15),(int)(Rect.top+345),(int)(Rect.right- Rect.left-670),20,hwnd,NULL,hInstance,NULL); //SendMessage(hTotalOfBytes,WM_SETTEXT, 0, (LPARAM)(LPCSTR)TEXT("TotalOfBytes:")); HWND hAuthor=CreateWindow(TEXT("STATIC"),NULL,WS_CHILD|WS_VISIBLE|SS_LEFT ,(int)(Rect.left+65),(int)(Rect.top+350),(int)(Rect.right- Rect.left-50),20,hwnd,NULL,hInstance,NULL); SendMessage(hAuthor,WM_SETTEXT, 0, (LPARAM)(LPCSTR)TEXT("(c) Косоногова М.А., гр. ИТ-31, 2008")); hListBoxErr= CreateWindow( TEXT("LISTBOX"), NULL, WS_CHILD | /*LBS_STANDARD |*/ WS_VSCROLL | LBS_DISABLENOSCROLL | WS_VISIBLE/* & (~LBS_SORT)*/, 50,200, 300, 100, hwnd, NULL, hInstance, NULL); return TRUE; } void OnCommand (HWND hwnd, int id, HWND hw, UINT){ //------------------------------------------------------------------------------------- if (hw==hButExit) OnClickButExit(); if (hw==hButClear) OnClickButClear(hWndMain); if (hw==hButOpen) OnClickButOpen(hWndMain); if (hw==hButCreateMap) OnClickButCreateMap(hWndMain); if (hw==hButOpenMap) OnClickButCreateMap(hWndMain); if (hw==hButCloseMap) OnClickCloseMap(hWndMain); } void OnClickButExit() { PostQuitMessage(0); } void OnClickButClear(HWND hwnd) { RECT Rect; GetClientRect(hwnd,&Rect); hListBoxErr= CreateWindow( TEXT("LISTBOX"), NULL, WS_CHILD | /*LBS_STANDARD |*/ WS_VSCROLL | LBS_DISABLENOSCROLL | WS_VISIBLE/* & (~LBS_SORT)*/, 50,200, 300, 100, hwnd, NULL, hInstance, NULL); } void OnClickButOpen(HWND hwnd) { /*LPCWSTR lpFilter=TEXT("Text\0*.TXT\0"); ZeroMemory(&ofn,sizeof(OPENFILENAME)); ofn.lStructSize=sizeof(OPENFILENAME) ; ofn.hwndOwner=hWndMain; ofn.hInstance=NULL; ofn.lpstrFile = szFileName; ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = sizeof(szFileName); ofn.lpstrFilter = lpFilter; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if (!GetOpenFileName(&ofn)) { MessageBox(hwnd,TEXT("Error by open file"),TEXT("Error"),MB_ICONERROR); wsprintf(szBufErr,L"Error by open file"); SendMessage(hListBoxErr,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)szBufErr); } else { hFile=CreateFile(szFileName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,NULL,NULL); if (hFile==INVALID_HANDLE_VALUE) { MessageBox(hwnd,TEXT("File isn't opened or created"),TEXT("Error"),MB_ICONERROR); wsprintf(szBufErr,L"File isn't opened"); SendMessage(hListBoxErr,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)szBufErr); } else { wsprintf(szBufErr,L"File was opened successfully"); SendMessage(hListBoxErr,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)szBufErr); } }*/ } void OnClickButCreateMap(HWND hwnd) { RECT Rect; GetClientRect(hwnd,&Rect); s_hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4 * 1024, TEXT("MMFSharedData")); if (s_hFileMap != NULL) { if (GetLastError() == ERROR_ALREADY_EXISTS) { wsprintf(szBufErr,L"Mapping already exists - not created."); SendMessage(hListBoxErr,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)szBufErr); CloseHandle(s_hFileMap); } else { // File mapping created successfully. // Map a view of the file into the address space. PVOID pView = MapViewOfFile(s_hFileMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); if (pView != NULL) { // Put edit text into the MMF. Edit_GetText(hEditData,(PTSTR) pView, 4 * 1024); // Protect the MMF storage by unmapping it. UnmapViewOfFile(pView); // The user can't create another file right now. //Button_Enable(hwndCtl, FALSE); // The user closed the file. //Button_Enable(GetDlgItem(hwnd, IDC_CLOSEFILE), TRUE); } else { wsprintf(szBufErr,L"Can't map view of file."); SendMessage(hListBoxErr,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)szBufErr); } } } else { wsprintf(szBufErr,L"Can't create file mapping."); SendMessage(hListBoxErr,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)szBufErr); } } void OnClickButOpenMap(HWND hwnd) { RECT Rect; GetClientRect(hwnd,&Rect); HANDLE hFileMapT = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, TEXT("MMFSharedData")); if (hFileMapT != NULL) { // The MMF does exist, map it into the process's address space. PVOID pView = MapViewOfFile(hFileMapT, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); if (pView != NULL) { // Put the contents of the MMF into the edit control. Edit_SetText(hEditData, (PTSTR) pView); UnmapViewOfFile(pView); } else { wsprintf(szBufErr,L"Can't map view."); SendMessage(hListBoxErr,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)szBufErr); } CloseHandle(hFileMapT); } else { wsprintf(szBufErr,L"Can't open mapping."); SendMessage(hListBoxErr,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)szBufErr); } } void OnClickCloseMap(HWND hwnd) { if (CloseHandle(s_hFileMap)) { // User closed the file, fix up the buttons. //Button_Enable(hBut, TRUE); //Button_Enable(hwndCtl, FALSE); } }