诸暨麻将添加redis
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

288 行
8.7 KiB

  1. #include "StdAfx.h"
  2. #include "ProcessControl.h"
  3. //////////////////////////////////////////////////////////////////////////////////
  4. //宏定义
  5. //标识定义
  6. #define IDC_PROCESS_CONTROL 100 //窗口标识
  7. //消息定义
  8. #define WM_ASYNCHRONISM_DATA (WM_USER+100) //异步数据
  9. //////////////////////////////////////////////////////////////////////////////////
  10. //异步数据
  11. struct tagAsynchronismData
  12. {
  13. HWND hWndSend; //发送窗口
  14. WORD wDataSize; //数据大小
  15. WORD wSubCmdID; //子命令码
  16. WORD wMainCmdID; //主命令码
  17. BYTE cbBuffer[IPC_PACKET]; //数据缓冲
  18. };
  19. //////////////////////////////////////////////////////////////////////////////////
  20. BEGIN_MESSAGE_MAP(CProcessControl, CWnd)
  21. ON_WM_COPYDATA()
  22. ON_MESSAGE(WM_ASYNCHRONISM_DATA, OnMessageAsynchronismData)
  23. END_MESSAGE_MAP()
  24. //////////////////////////////////////////////////////////////////////////////////
  25. //构造函数
  26. CProcessControl::CProcessControl()
  27. {
  28. //设置变量
  29. m_pIProcessControlSink = NULL;
  30. return;
  31. }
  32. //析构函数
  33. CProcessControl::~CProcessControl()
  34. {
  35. }
  36. //接口查询
  37. VOID * CProcessControl::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
  38. {
  39. QUERYINTERFACE(IProcessControl, Guid, dwQueryVer);
  40. QUERYINTERFACE_IUNKNOWNEX(IProcessControl, Guid, dwQueryVer);
  41. return NULL;
  42. }
  43. //获取句柄
  44. HWND CProcessControl::GetProcessControlWnd()
  45. {
  46. return m_hWnd;
  47. }
  48. //创建通讯
  49. bool CProcessControl::SetProcessControlSink(IUnknownEx * pIUnknownEx)
  50. {
  51. //设置接口
  52. if (pIUnknownEx != NULL)
  53. {
  54. //查询接口
  55. ASSERT(QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IProcessControlSink) != NULL);
  56. m_pIProcessControlSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IProcessControlSink);
  57. //成功判断
  58. if (m_pIProcessControlSink == NULL) return false;
  59. }
  60. else m_pIProcessControlSink = NULL;
  61. return true;
  62. }
  63. //配置连接
  64. bool CProcessControl::InitializeLink()
  65. {
  66. //效验参数
  67. ASSERT(m_pIProcessControlSink != NULL);
  68. if (m_pIProcessControlSink == NULL) return false;
  69. //创建窗口
  70. if (m_hWnd == NULL)
  71. {
  72. CRect rcCreate(0, 0, 0, 0);
  73. Create(NULL, NULL, WS_CHILD, rcCreate, GetDesktopWindow(), IDC_PROCESS_CONTROL);
  74. }
  75. return true;
  76. }
  77. //销毁通讯
  78. bool CProcessControl::UnInitializeLink()
  79. {
  80. //清理队列
  81. m_DataQueue.RemoveData(false);
  82. //关闭窗口
  83. if (m_hWnd != NULL) DestroyWindow();
  84. return true;
  85. }
  86. //发送数据
  87. bool CProcessControl::SendData(HWND hWndServer, WORD wMainCmdID, WORD wSubCmdID)
  88. {
  89. //效验参数
  90. if (IsWindow(m_hWnd) == FALSE) return false;
  91. if (IsWindow(hWndServer) == FALSE) return false;
  92. //构造数据
  93. IPC_Head IPCHead;
  94. IPCHead.wVersion = IPC_VER;
  95. IPCHead.wSubCmdID = wSubCmdID;
  96. IPCHead.wMainCmdID = wMainCmdID;
  97. IPCHead.wPacketSize = sizeof(IPC_Head);
  98. //发送数据
  99. COPYDATASTRUCT CopyDataStruct;
  100. CopyDataStruct.lpData = &IPCHead;
  101. CopyDataStruct.dwData = IDT_ASYNCHRONISM;
  102. CopyDataStruct.cbData = IPCHead.wPacketSize;
  103. ::SendMessage(hWndServer, WM_COPYDATA, (LPARAM)m_hWnd, (WPARAM)&CopyDataStruct);
  104. return true;
  105. }
  106. //发送数据
  107. bool CProcessControl::SendData(HWND hWndServer, WORD wMainCmdID, WORD wSubCmdID, VOID * const pData, WORD wDataSize)
  108. {
  109. //效验参数
  110. if (IsWindow(m_hWnd) == FALSE) return false;
  111. if (IsWindow(hWndServer) == FALSE) return false;
  112. //构造数据
  113. IPC_Buffer IPCBuffer;
  114. IPCBuffer.Head.wVersion = IPC_VER;
  115. IPCBuffer.Head.wSubCmdID = wSubCmdID;
  116. IPCBuffer.Head.wMainCmdID = wMainCmdID;
  117. IPCBuffer.Head.wPacketSize = sizeof(IPCBuffer.Head);
  118. //附加数据
  119. if (pData != NULL)
  120. {
  121. //效验长度
  122. ASSERT(wDataSize <= sizeof(IPCBuffer.cbBuffer));
  123. if (wDataSize > sizeof(IPCBuffer.cbBuffer)) return false;
  124. //拷贝数据
  125. IPCBuffer.Head.wPacketSize += wDataSize;
  126. CopyMemory(IPCBuffer.cbBuffer, pData, wDataSize);
  127. }
  128. //发送数据
  129. COPYDATASTRUCT CopyDataStruct;
  130. CopyDataStruct.lpData = &IPCBuffer;
  131. CopyDataStruct.dwData = IDT_ASYNCHRONISM;
  132. CopyDataStruct.cbData = IPCBuffer.Head.wPacketSize;
  133. ::SendMessage(hWndServer, WM_COPYDATA, (LPARAM)m_hWnd, (WPARAM)&CopyDataStruct);
  134. return true;
  135. }
  136. //执行命令
  137. bool CProcessControl::SendCommand(HWND hWndServer, WORD wMainCmdID, WORD wSubCmdID, VOID * const pData, WORD wDataSize)
  138. {
  139. //效验参数
  140. if (IsWindow(m_hWnd) == FALSE) return false;
  141. if (IsWindow(hWndServer) == FALSE) return false;
  142. //构造数据
  143. IPC_Buffer IPCBuffer;
  144. IPCBuffer.Head.wVersion = IPC_VER;
  145. IPCBuffer.Head.wSubCmdID = wSubCmdID;
  146. IPCBuffer.Head.wMainCmdID = wMainCmdID;
  147. IPCBuffer.Head.wPacketSize = sizeof(IPCBuffer.Head);
  148. //附加数据
  149. if (pData != NULL)
  150. {
  151. //效验长度
  152. ASSERT(wDataSize <= sizeof(IPCBuffer.cbBuffer));
  153. if (wDataSize > sizeof(IPCBuffer.cbBuffer)) return false;
  154. //拷贝数据
  155. IPCBuffer.Head.wPacketSize += wDataSize;
  156. CopyMemory(IPCBuffer.cbBuffer, pData, wDataSize);
  157. }
  158. //发送数据
  159. COPYDATASTRUCT CopyDataStruct;
  160. CopyDataStruct.lpData = &IPCBuffer;
  161. CopyDataStruct.dwData = IDT_IMMEDIATE;
  162. CopyDataStruct.cbData = IPCBuffer.Head.wPacketSize;
  163. ::SendMessage(hWndServer, WM_COPYDATA, (LPARAM)m_hWnd, (WPARAM)&CopyDataStruct);
  164. return true;
  165. }
  166. //IPC 消息
  167. BOOL CProcessControl::OnCopyData(CWnd * pWnd, COPYDATASTRUCT * pCopyDataStruct)
  168. {
  169. //效验接口
  170. ASSERT(m_pIProcessControlSink != NULL);
  171. if (m_pIProcessControlSink == NULL) return FALSE;
  172. //效验参数
  173. ASSERT(pCopyDataStruct->cbData >= sizeof(IPC_Head));
  174. if (pCopyDataStruct->cbData < sizeof(IPC_Head)) return FALSE;
  175. //效验数据
  176. IPC_Head * pHead = (IPC_Head *)pCopyDataStruct->lpData;
  177. ASSERT((pHead->wVersion == IPC_VER) && (pHead->wPacketSize == pCopyDataStruct->cbData));
  178. if ((pHead->wVersion != IPC_VER) || (pHead->wPacketSize != pCopyDataStruct->cbData)) return FALSE;
  179. //数据处理
  180. switch (pCopyDataStruct->dwData)
  181. {
  182. case IDT_IMMEDIATE: //同步数据
  183. {
  184. //数据处理
  185. WORD wDataSize = pHead->wPacketSize - sizeof(IPC_Head);
  186. m_pIProcessControlSink->OnProcessControlData(pHead->wMainCmdID, pHead->wSubCmdID, pHead + 1, wDataSize, pWnd->m_hWnd);
  187. return true;
  188. }
  189. case IDT_ASYNCHRONISM: //异步数据
  190. {
  191. //构造数据
  192. tagAsynchronismData AsynchronismData;
  193. AsynchronismData.wSubCmdID = pHead->wSubCmdID;
  194. AsynchronismData.wMainCmdID = pHead->wMainCmdID;
  195. AsynchronismData.hWndSend = pWnd->GetSafeHwnd();
  196. AsynchronismData.wDataSize = pHead->wPacketSize - sizeof(IPC_Head);
  197. CopyMemory(&AsynchronismData.cbBuffer, pHead + 1, pHead->wPacketSize - sizeof(IPC_Head));
  198. //插入数据
  199. WORD wHeadSize = sizeof(AsynchronismData)-sizeof(AsynchronismData.cbBuffer);
  200. m_DataQueue.InsertData(IDT_ASYNCHRONISM, &AsynchronismData, wHeadSize + AsynchronismData.wDataSize);
  201. //投递消息
  202. ASSERT(pWnd != NULL);
  203. if (pWnd != NULL) PostMessage(WM_ASYNCHRONISM_DATA, (WPARAM)(pWnd->m_hWnd), (LPARAM)(pHead->wPacketSize));
  204. return true;
  205. }
  206. }
  207. return TRUE;
  208. }
  209. //通知消息
  210. LRESULT CProcessControl::OnMessageAsynchronismData(WPARAM wParam, LPARAM lParam)
  211. {
  212. //提取数据
  213. tagDataHead DataHead;
  214. tagAsynchronismData AsynchronismData;
  215. if (m_DataQueue.DistillData(DataHead, &AsynchronismData, sizeof(AsynchronismData)) == false)
  216. {
  217. ASSERT(FALSE);
  218. return 0;
  219. }
  220. //状态效验
  221. ASSERT(m_pIProcessControlSink != NULL);
  222. if (m_pIProcessControlSink == NULL) return 0;
  223. //数据处理
  224. HWND hWndClient = AsynchronismData.hWndSend;
  225. WORD wSubCmdID = AsynchronismData.wSubCmdID;
  226. WORD wMainCmdID = AsynchronismData.wMainCmdID;
  227. m_pIProcessControlSink->OnProcessControlData(wMainCmdID, wSubCmdID, AsynchronismData.cbBuffer, AsynchronismData.wDataSize, hWndClient);
  228. return 0;
  229. }
  230. //////////////////////////////////////////////////////////////////////////////////
  231. //组件创建函数
  232. DECLARE_CREATE_MODULE(ProcessControl);
  233. //////////////////////////////////////////////////////////////////////////////////