Advertisement
Guest User

InterComm

a guest
Jul 23rd, 2012
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.77 KB | None | 0 0
  1. enum InterCommMode
  2. {
  3.     MODE_SERVER,
  4.     MODE_CLIENT
  5. };
  6.  
  7. enum DataMode
  8. {
  9.     MODE_CMDLINE
  10. };
  11.  
  12. typedef int (__stdcall *MessageReceivedDelegate)(DataMode id, PCHAR data);
  13.  
  14. class CInterComm
  15. {
  16. public:
  17.     CInterComm();
  18.     virtual ~CInterComm();
  19.  
  20.     static DWORD _stdcall NewThread(LPVOID lpParam)
  21.     {
  22.         CInterComm* pInterComm = (CInterComm*) lpParam;
  23.         return pInterComm->CreateInterCommWindow(pInterComm->m_hInstance);
  24.     }
  25.  
  26.     BOOL Initialize(HINSTANCE hInstance, MessageReceivedDelegate MessageReceived);
  27.     VOID Shutdown();
  28.     DWORD WINAPI CreateInterCommWindow(HINSTANCE hInstance);
  29.     BOOL IsFirstInstance();
  30.     HWND GetTargethWnd();
  31.     BOOL SendMessage(INT id, PCHAR str);
  32.     static LRESULT CALLBACK StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  33.     CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
  34.  
  35.     InterCommMode CommMode() const { return m_interCommMode; }
  36.  
  37. private:
  38.     HINSTANCE m_hInstance;
  39.     HANDLE m_hThread;
  40.     DWORD m_tid;
  41.     HWND m_hWnd;
  42.     HANDLE m_hMutex;
  43.     MessageReceivedDelegate m_MessageReceived;
  44.  
  45.     PCHAR m_szWindowName;
  46.     PCHAR m_szClassName;
  47.  
  48.     InterCommMode m_interCommMode;
  49. };
  50.  
  51. // ------------------------------------------
  52.  
  53. #include "stdafx.h"
  54. #include "InterComm.h"
  55.  
  56. #define INTERCOMM_WINDOWNAME    "JoyTray_InterComm"
  57. #define INTERCOMM_SERVERNAME    "JoyTray_Server"
  58. #define INTERCOMM_CLIENTNAME    "JoyTray_Client"
  59. #define INTERCOMM_MUTEXNAME     "JoyTray_Mutex"
  60.  
  61. CInterComm::CInterComm()
  62. {
  63.     m_szWindowName = INTERCOMM_WINDOWNAME;
  64.     m_szClassName = INTERCOMM_SERVERNAME;
  65.     m_interCommMode = MODE_SERVER;
  66.     m_hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, INTERCOMM_MUTEXNAME);
  67.     m_MessageReceived = NULL;
  68. }
  69.  
  70. CInterComm::~CInterComm()
  71. {
  72.     Shutdown();
  73. }
  74.  
  75. BOOL CInterComm::Initialize(HINSTANCE hInstance, MessageReceivedDelegate MessageReceived)
  76. {
  77.     m_hInstance = hInstance;
  78.     m_MessageReceived = MessageReceived;
  79.  
  80.     if (!IsFirstInstance())
  81.     {
  82.         m_interCommMode = MODE_CLIENT;
  83.         m_szClassName = INTERCOMM_CLIENTNAME;
  84.     }
  85.  
  86.     m_hThread = CreateThread(NULL, 0, CInterComm::NewThread, this, 0, &m_tid);
  87.    
  88.     if(m_hThread != NULL)
  89.         return TRUE;
  90.  
  91.     return FALSE;
  92. }
  93.  
  94. VOID CInterComm::Shutdown()
  95. {
  96.     PostThreadMessage(m_tid, WM_QUIT, NULL, NULL);
  97.     ::SendMessage(m_hWnd, WM_CLOSE, 0, 0);
  98.  
  99.     if(m_hThread != NULL)
  100.     {
  101.         CloseHandle(m_hThread);
  102.         m_hThread = NULL;
  103.     }
  104.  
  105.     if (m_hMutex != NULL)
  106.     {
  107.         ReleaseMutex(m_hMutex);
  108.         m_hMutex = NULL;
  109.     }
  110. }
  111.  
  112. DWORD WINAPI CInterComm::CreateInterCommWindow(HINSTANCE hInstance)
  113. {
  114.     DWORD retVal = 0;
  115.  
  116.     WNDCLASS wc = { 0 };
  117.     wc.lpszClassName = m_szClassName;
  118.     wc.hInstance   = hInstance;
  119.     wc.lpfnWndProc = CInterComm::StaticWndProc;
  120.  
  121.     if(!RegisterClass(&wc))
  122.         goto error;
  123.  
  124.     m_hWnd = CreateWindowEx(
  125.         0,
  126.         m_szClassName,
  127.         m_szWindowName,
  128.         WS_OVERLAPPEDWINDOW,
  129.         0, 0,
  130.         1, 1,
  131.         NULL,
  132.         NULL,
  133.         hInstance,
  134.         this);
  135.  
  136.     if(m_hWnd == NULL)
  137.         goto error;
  138.  
  139.     MSG msg;
  140.  
  141.     while(GetMessage(&msg, NULL, 0, 0))
  142.     {
  143.         TranslateMessage(&msg);
  144.         DispatchMessage(&msg);
  145.     }
  146.  
  147.     retVal = (int) msg.wParam;
  148.  
  149. error:
  150.  
  151.     DestroyWindow(m_hWnd);
  152.     UnregisterClass(m_szClassName, hInstance);
  153.  
  154.     return retVal;
  155. }
  156.  
  157. LRESULT CALLBACK CInterComm::StaticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  158. {
  159.     CInterComm* pParent;
  160.  
  161.     // Get pointer to window
  162.     if(uMsg == WM_CREATE)
  163.     {
  164.         pParent = (CInterComm*) ((LPCREATESTRUCT)lParam)->lpCreateParams;
  165.         SetWindowLongPtr(hWnd, GWL_USERDATA,(LONG_PTR) pParent);
  166.     }
  167.     else
  168.     {
  169.         pParent = (CInterComm*) GetWindowLongPtr(hWnd, GWL_USERDATA);
  170.  
  171.         if(!pParent)
  172.             return DefWindowProc(hWnd, uMsg, wParam, lParam);
  173.     }
  174.  
  175.     pParent->m_hWnd = hWnd;
  176.  
  177.     return pParent->WndProc(hWnd, uMsg, wParam, lParam);
  178. }
  179.  
  180. BOOL CInterComm::IsFirstInstance()
  181. {
  182.     if (!m_hMutex)
  183.     {
  184.         m_hMutex = CreateMutex(0, 0, INTERCOMM_MUTEXNAME);
  185.  
  186.         return TRUE;
  187.     }
  188.  
  189.     return FALSE;
  190. }
  191.  
  192. HWND CInterComm::GetTargethWnd()
  193. {
  194.     switch (m_interCommMode)
  195.     {
  196.         case MODE_SERVER:
  197.             return FindWindow(INTERCOMM_CLIENTNAME, m_szWindowName);
  198.         case MODE_CLIENT:
  199.             return FindWindow(INTERCOMM_SERVERNAME, m_szWindowName);
  200.     }
  201.  
  202.     return NULL;
  203. }
  204.  
  205. BOOL CInterComm::SendMessage(INT id, PCHAR str)
  206. {
  207.     HWND hWnd = GetTargethWnd();
  208.  
  209.     if (hWnd == NULL)
  210.         return FALSE;
  211.  
  212.     COPYDATASTRUCT cds;
  213.  
  214.     cds.cbData = strlen(str) + 1;
  215.     cds.lpData = str;
  216.     cds.dwData = 0;
  217.  
  218.     ::SendMessage(hWnd, WM_COPYDATA, (WPARAM) id, (LPARAM) &cds);
  219.  
  220.     return TRUE;
  221. }
  222.  
  223. CALLBACK CInterComm::WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  224. {
  225.     switch (msg)
  226.     {
  227.         case WM_COPYDATA:
  228.             PCOPYDATASTRUCT cds = (PCOPYDATASTRUCT) lParam;
  229.  
  230.             if (m_MessageReceived != NULL)
  231.                 m_MessageReceived((DataMode) wParam, (PCHAR) cds->lpData);
  232.             break;
  233.     }
  234.  
  235.     return DefWindowProc(hWnd, msg, wParam, lParam);
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement