Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Windows.h>
- #include <windowsx.h>
- #include <process.h>
- #include <iostream>
- #include "resource.h"
- using namespace std;
- #define BUF_SIZE 1024 //1kb
- LPCWSTR szName = L"MyFileMappingObject";
- HANDLE hMapFile, hThread;
- HANDLE rwEvent, exitEvent;
- LPCTSTR pBuf;
- const int ButtonCount = 9;
- BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
- BOOL CreateMapping();
- void InitMapping();
- void WINAPIV thread(void*)
- {
- //Создаем mapped file
- InitMapping();
- //Определяем путь к клиенту
- WCHAR path[MAX_PATH];
- GetModuleFileName(NULL, path, MAX_PATH);
- WCHAR *lstChr = wcsrchr(path, '\\') + 1;
- wcscpy(lstChr, L"os_laba4yar_client.exe");
- STARTUPINFO si;
- PROCESS_INFORMATION pi;
- ZeroMemory(&si, sizeof(si));
- si.cb = sizeof(si);
- ZeroMemory(&pi, sizeof(pi));
- GetStartupInfo(&si);
- //Запускаем клиент
- CreateProcess(path, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
- _endthread();
- }
- int WINAPI wWinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPWSTR lpCmdLine,
- int nCmdShow)
- {
- //Создаем ивенты и поток
- rwEvent = CreateEvent(
- NULL,
- TRUE,
- FALSE,
- L"ReadWriteEvent"
- );
- exitEvent = CreateEvent(
- NULL,
- TRUE,
- FALSE,
- L"exitEvent"
- );
- hThread = (HANDLE)_beginthread(&thread, 0, NULL);
- //Отображаем окно
- DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG_MAIN), 0, (DlgProc), 0);
- return 0;
- }
- BOOL CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- int butID, status;
- switch (uMsg)
- {
- case WM_INITDIALOG:
- break;
- case WM_COMMAND:
- {
- //Получаем id и status нажатой кнопки
- switch (LOWORD(wParam))
- {
- case IDC_CHECK1:
- {
- butID = 1;
- if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK1)))
- status = 1;
- else
- status = 0;
- break;
- }
- case IDC_CHECK2:
- {
- butID = 2;
- if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK2)))
- status = 1;
- else
- status = 0;
- break;
- }
- case IDC_CHECK3:
- {
- butID = 3;
- if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK3)))
- status = 1;
- else
- status = 0;
- break;
- }
- case IDC_CHECK4:
- {
- butID = 4;
- if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK4)))
- status = 1;
- else
- status = 0;
- break;
- }
- case IDC_CHECK5:
- {
- butID = 5;
- if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK5)))
- status = 1;
- else
- status = 0;
- break;
- }
- case IDC_CHECK6:
- {
- butID = 6;
- if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK6)))
- status = 1;
- else
- status = 0;
- break;
- }
- case IDC_CHECK7:
- {
- butID = 7;
- if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK7)))
- status = 1;
- else
- status = 0;
- break;
- }
- case IDC_CHECK8:
- {
- butID = 8;
- if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK8)))
- status = 1;
- else
- status = 0;
- break;
- }
- case IDC_CHECK9:
- {
- butID = 9;
- if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK9)))
- status = 1;
- else
- status = 0;
- break;
- }
- default:
- break;
- }
- //Перезаписываем в mapped file инфу о статусе кнопки
- CopyMemory((PVOID)(pBuf + sizeof(int) * butID), &status, sizeof(int));
- //Устанавливаем ивент и немного ждем, сбрасываем. Клиент начнет чтение с mapped file
- SetEvent(rwEvent);
- Sleep(200);
- ResetEvent(rwEvent);
- break;
- }
- case WM_CLOSE:
- {
- //Обрабатываем закрытие окна, закрываем хэндлы
- SetEvent(rwEvent);
- SetEvent(exitEvent);
- Sleep(200);
- CloseHandle(rwEvent);
- CloseHandle(hThread);
- CloseHandle(exitEvent);
- CloseHandle(hMapFile);
- EndDialog(hWnd, 0);
- return FALSE;
- }
- }
- return FALSE;
- }
- BOOL CreateMapping()
- {
- //Создаем mapped file
- hMapFile = CreateFileMapping(
- INVALID_HANDLE_VALUE,
- NULL,
- PAGE_READWRITE,
- 0,
- BUF_SIZE,
- szName);
- if (hMapFile == NULL)
- {
- cerr << "Could not create file mapping object " << GetLastError() << endl;
- return FALSE;
- }
- //Открываем
- pBuf = (LPTSTR)MapViewOfFile(hMapFile,
- FILE_MAP_ALL_ACCESS,
- 0,
- 0,
- BUF_SIZE);
- if (pBuf == NULL)
- {
- cerr << "Could not map view of file " << GetLastError() << endl;
- CloseHandle(hMapFile);
- return FALSE;
- }
- return TRUE;
- }
- void InitMapping()
- {
- //Создаем mapped file
- CreateMapping();
- //Заполняем его инфой по умолчанию
- //Первый int - кол-во кнопок, остальные - статус каждой из них
- CopyMemory((PVOID)pBuf, &ButtonCount, sizeof(int));
- for (int i = 1; i <= ButtonCount; i++)
- {
- CopyMemory((PVOID)(pBuf + sizeof(int) * i), new int(0), sizeof(int));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement