Advertisement
AlukardBF

os_yar4_server

Apr 24th, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <Windows.h>
  2. #include <windowsx.h>
  3. #include <process.h>
  4. #include <iostream>
  5. #include "resource.h"
  6. using namespace std;
  7. #define BUF_SIZE 1024 //1kb
  8.  
  9. LPCWSTR szName = L"MyFileMappingObject";
  10. HANDLE hMapFile, hThread;
  11. HANDLE rwEvent, exitEvent;
  12. LPCTSTR pBuf;
  13. const int ButtonCount = 9;
  14.  
  15. BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
  16. BOOL CreateMapping();
  17. void InitMapping();
  18.  
  19. void WINAPIV thread(void*)
  20. {
  21.     //Создаем mapped file
  22.     InitMapping();
  23.     //Определяем путь к клиенту
  24.     WCHAR path[MAX_PATH];
  25.     GetModuleFileName(NULL, path, MAX_PATH);
  26.     WCHAR *lstChr = wcsrchr(path, '\\') + 1;
  27.     wcscpy(lstChr, L"os_laba4yar_client.exe");
  28.  
  29.     STARTUPINFO si;
  30.     PROCESS_INFORMATION pi;
  31.     ZeroMemory(&si, sizeof(si));
  32.     si.cb = sizeof(si);
  33.     ZeroMemory(&pi, sizeof(pi));
  34.     GetStartupInfo(&si);
  35.     //Запускаем клиент
  36.     CreateProcess(path, NULL, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
  37.     _endthread();
  38. }
  39.  
  40. int WINAPI wWinMain(HINSTANCE hInstance,
  41.     HINSTANCE hPrevInstance,
  42.     LPWSTR lpCmdLine,
  43.     int nCmdShow)
  44. {
  45.     //Создаем ивенты и поток
  46.     rwEvent = CreateEvent(
  47.         NULL,
  48.         TRUE,
  49.         FALSE,
  50.         L"ReadWriteEvent"
  51.     );
  52.     exitEvent = CreateEvent(
  53.         NULL,
  54.         TRUE,
  55.         FALSE,
  56.         L"exitEvent"
  57.     );
  58.     hThread = (HANDLE)_beginthread(&thread, 0, NULL);
  59.     //Отображаем окно
  60.     DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG_MAIN), 0, (DlgProc), 0);
  61.     return 0;
  62. }
  63.  
  64. BOOL CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  65. {
  66.     int butID, status;
  67.  
  68.     switch (uMsg)
  69.     {
  70.     case WM_INITDIALOG:
  71.         break;
  72.     case WM_COMMAND:
  73.     {
  74.         //Получаем id и status нажатой кнопки
  75.         switch (LOWORD(wParam))
  76.         {
  77.         case IDC_CHECK1:
  78.         {
  79.             butID = 1;
  80.             if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK1)))
  81.                 status = 1;
  82.             else
  83.                 status = 0;
  84.             break;
  85.         }
  86.         case IDC_CHECK2:
  87.         {
  88.             butID = 2;
  89.             if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK2)))
  90.                 status = 1;
  91.             else
  92.                 status = 0;
  93.             break;
  94.         }
  95.         case IDC_CHECK3:
  96.         {
  97.             butID = 3;
  98.             if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK3)))
  99.                 status = 1;
  100.             else
  101.                 status = 0;
  102.             break;
  103.         }
  104.         case IDC_CHECK4:
  105.         {
  106.             butID = 4;
  107.             if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK4)))
  108.                 status = 1;
  109.             else
  110.                 status = 0;
  111.             break;
  112.         }
  113.         case IDC_CHECK5:
  114.         {
  115.             butID = 5;
  116.             if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK5)))
  117.                 status = 1;
  118.             else
  119.                 status = 0;
  120.             break;
  121.         }
  122.         case IDC_CHECK6:
  123.         {
  124.             butID = 6;
  125.             if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK6)))
  126.                 status = 1;
  127.             else
  128.                 status = 0;
  129.             break;
  130.         }
  131.         case IDC_CHECK7:
  132.         {
  133.             butID = 7;
  134.             if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK7)))
  135.                 status = 1;
  136.             else
  137.                 status = 0;
  138.             break;
  139.         }
  140.         case IDC_CHECK8:
  141.         {
  142.             butID = 8;
  143.             if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK8)))
  144.                 status = 1;
  145.             else
  146.                 status = 0;
  147.             break;
  148.         }
  149.         case IDC_CHECK9:
  150.         {
  151.             butID = 9;
  152.             if (BST_CHECKED == Button_GetCheck(GetDlgItem(hWnd, IDC_CHECK9)))
  153.                 status = 1;
  154.             else
  155.                 status = 0;
  156.             break;
  157.         }
  158.         default:
  159.             break;
  160.         }
  161.         //Перезаписываем в mapped file инфу о статусе кнопки
  162.         CopyMemory((PVOID)(pBuf + sizeof(int) * butID), &status, sizeof(int));
  163.         //Устанавливаем ивент и немного ждем, сбрасываем. Клиент начнет чтение с mapped file
  164.         SetEvent(rwEvent);
  165.         Sleep(200);
  166.         ResetEvent(rwEvent);
  167.         break;
  168.     }
  169.     case WM_CLOSE:
  170.     {
  171.         //Обрабатываем закрытие окна, закрываем хэндлы
  172.         SetEvent(rwEvent);
  173.         SetEvent(exitEvent);
  174.         Sleep(200);
  175.         CloseHandle(rwEvent);
  176.         CloseHandle(hThread);
  177.         CloseHandle(exitEvent);
  178.         CloseHandle(hMapFile);
  179.         EndDialog(hWnd, 0);
  180.         return FALSE;
  181.     }
  182.     }
  183.     return FALSE;
  184. }
  185.  
  186. BOOL CreateMapping()
  187. {
  188.     //Создаем mapped file
  189.     hMapFile = CreateFileMapping(
  190.         INVALID_HANDLE_VALUE,
  191.         NULL,
  192.         PAGE_READWRITE,
  193.         0,
  194.         BUF_SIZE,
  195.         szName);
  196.  
  197.     if (hMapFile == NULL)
  198.     {
  199.         cerr << "Could not create file mapping object " << GetLastError() << endl;
  200.         return FALSE;
  201.     }
  202.     //Открываем
  203.     pBuf = (LPTSTR)MapViewOfFile(hMapFile,
  204.         FILE_MAP_ALL_ACCESS,
  205.         0,
  206.         0,
  207.         BUF_SIZE);
  208.  
  209.     if (pBuf == NULL)
  210.     {
  211.         cerr << "Could not map view of file " << GetLastError() << endl;
  212.         CloseHandle(hMapFile);
  213.         return FALSE;
  214.     }
  215.     return TRUE;
  216. }
  217.  
  218. void InitMapping()
  219. {
  220.     //Создаем mapped file
  221.     CreateMapping();
  222.     //Заполняем его инфой по умолчанию
  223.     //Первый int - кол-во кнопок, остальные - статус каждой из них
  224.     CopyMemory((PVOID)pBuf, &ButtonCount, sizeof(int));
  225.     for (int i = 1; i <= ButtonCount; i++)
  226.     {
  227.         CopyMemory((PVOID)(pBuf + sizeof(int) * i), new int(0), sizeof(int));
  228.     }
  229. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement