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

261 行
6.8 KiB

  1. #include "StdAfx.h"
  2. #include "ProcessDataControl.h"
  3. //////////////////////////////////////////////////////////////////////////////////
  4. //处理类型
  5. #define IDT_IMMEDIATE 0x0101 //同步数据
  6. #define IDT_ASYNCHRONISM 0x0201 //异步数据
  7. //////////////////////////////////////////////////////////////////////////////////
  8. //函数定义
  9. CProcessSendData::CProcessSendData(HWND hWndServer, HWND hWndClient)
  10. {
  11. //设置变量
  12. m_hWndServer = hWndServer;
  13. m_hWndClient = hWndClient;
  14. return;
  15. }
  16. //析构函数
  17. CProcessSendData::~CProcessSendData()
  18. {
  19. }
  20. //是否连接
  21. bool CProcessSendData::IsConnect()
  22. {
  23. return IsWindow(m_hWndServer) ? true : false;
  24. }
  25. //获取窗口
  26. HWND CProcessSendData::GetClientHwnd()
  27. {
  28. return m_hWndClient;
  29. }
  30. //获取窗口
  31. HWND CProcessSendData::GetServerHwnd()
  32. {
  33. return m_hWndServer;
  34. }
  35. //设置窗口
  36. bool CProcessSendData::SetClientHwnd(HWND hWndClient)
  37. {
  38. //设置变量
  39. m_hWndClient = NULL;
  40. //窗口效验
  41. if ((hWndClient != NULL) && (IsWindow(hWndClient)))
  42. {
  43. m_hWndClient = hWndClient;
  44. return true;
  45. }
  46. return false;
  47. }
  48. //设置窗口
  49. bool CProcessSendData::SetServerHwnd(HWND hWndServer)
  50. {
  51. //设置变量
  52. m_hWndServer = NULL;
  53. //窗口效验
  54. if ((hWndServer != NULL) && (IsWindow(hWndServer)))
  55. {
  56. m_hWndServer = hWndServer;
  57. return true;
  58. }
  59. return false;
  60. }
  61. //设置窗口
  62. bool CProcessSendData::SetServerHwnd(LPCTSTR pszClassName)
  63. {
  64. //效验参数
  65. ASSERT(pszClassName != NULL);
  66. if (pszClassName == NULL) return false;
  67. //设置变量
  68. m_hWndServer = FindWindow(pszClassName, NULL);
  69. return (m_hWndServer != NULL);
  70. }
  71. //发送数据
  72. bool CProcessSendData::SendData(WORD wMainCmdID, WORD wSubCmdID)
  73. {
  74. //效验参数
  75. ASSERT(IsWindow(m_hWndServer));
  76. if (IsWindow(m_hWndServer) == FALSE) return false;
  77. //构造数据
  78. IPC_Head IPCHead;
  79. IPCHead.wVersion = IPC_VER;
  80. IPCHead.wSubCmdID = wSubCmdID;
  81. IPCHead.wMainCmdID = wMainCmdID;
  82. IPCHead.wPacketSize = sizeof(IPC_Head);
  83. //发送数据
  84. COPYDATASTRUCT CopyDataStruct;
  85. CopyDataStruct.lpData = &IPCHead;
  86. CopyDataStruct.dwData = IDT_ASYNCHRONISM;
  87. CopyDataStruct.cbData = IPCHead.wPacketSize;
  88. ::SendMessage(m_hWndServer, WM_COPYDATA, (LPARAM)m_hWndClient, (WPARAM)&CopyDataStruct);
  89. return true;
  90. }
  91. //发送数据
  92. bool CProcessSendData::SendData(WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
  93. {
  94. //效验参数
  95. ASSERT(IsWindow(m_hWndServer));
  96. if (IsWindow(m_hWndServer) == FALSE) return false;
  97. //构造数据
  98. IPC_Buffer IPCBuffer;
  99. IPCBuffer.Head.wVersion = IPC_VER;
  100. IPCBuffer.Head.wSubCmdID = wSubCmdID;
  101. IPCBuffer.Head.wMainCmdID = wMainCmdID;
  102. IPCBuffer.Head.wPacketSize = sizeof(IPCBuffer.Head);
  103. //附加数据
  104. if (pData != NULL)
  105. {
  106. //效验长度
  107. ASSERT(wDataSize <= sizeof(IPCBuffer.cbBuffer));
  108. if (wDataSize > sizeof(IPCBuffer.cbBuffer)) return false;
  109. //拷贝数据
  110. IPCBuffer.Head.wPacketSize += wDataSize;
  111. CopyMemory(IPCBuffer.cbBuffer, pData, wDataSize);
  112. }
  113. //发送数据
  114. COPYDATASTRUCT CopyDataStruct;
  115. CopyDataStruct.lpData = &IPCBuffer;
  116. CopyDataStruct.dwData = IDT_ASYNCHRONISM;
  117. CopyDataStruct.cbData = IPCBuffer.Head.wPacketSize;
  118. ::SendMessage(m_hWndServer, WM_COPYDATA, (LPARAM)m_hWndClient, (WPARAM)&CopyDataStruct);
  119. return true;
  120. }
  121. //执行命令
  122. bool CProcessSendData::TransferCommand(WORD wMainCmdID, WORD wSubCmdID, VOID * pData, WORD wDataSize)
  123. {
  124. //效验参数
  125. ASSERT(IsWindow(m_hWndServer));
  126. if (IsWindow(m_hWndServer) == FALSE) return false;
  127. //构造数据
  128. IPC_Buffer IPCBuffer;
  129. IPCBuffer.Head.wVersion = IPC_VER;
  130. IPCBuffer.Head.wSubCmdID = wSubCmdID;
  131. IPCBuffer.Head.wMainCmdID = wMainCmdID;
  132. IPCBuffer.Head.wPacketSize = sizeof(IPCBuffer.Head);
  133. //附加数据
  134. if (pData != NULL)
  135. {
  136. //效验长度
  137. ASSERT(wDataSize <= sizeof(IPCBuffer.cbBuffer));
  138. if (wDataSize > sizeof(IPCBuffer.cbBuffer)) return false;
  139. //拷贝数据
  140. IPCBuffer.Head.wPacketSize += wDataSize;
  141. CopyMemory(IPCBuffer.cbBuffer, pData, wDataSize);
  142. }
  143. //发送数据
  144. COPYDATASTRUCT CopyDataStruct;
  145. CopyDataStruct.lpData = &IPCBuffer;
  146. CopyDataStruct.dwData = IDT_IMMEDIATE;
  147. CopyDataStruct.cbData = IPCBuffer.Head.wPacketSize;
  148. ::SendMessage(m_hWndServer, WM_COPYDATA, (LPARAM)m_hWndClient, (WPARAM)&CopyDataStruct);
  149. return true;
  150. }
  151. //////////////////////////////////////////////////////////////////////////////////
  152. //构造函数
  153. CProcessRecvData::CProcessRecvData()
  154. {
  155. //设置变量
  156. m_pIIPCRecvDataSink = NULL;
  157. return;
  158. }
  159. //析构函数
  160. CProcessRecvData::~CProcessRecvData()
  161. {
  162. }
  163. //设置接口
  164. bool CProcessRecvData::SetProcessTradeSink(IUnknownEx * pIUnknownEx)
  165. {
  166. //设置接口
  167. if (pIUnknownEx != NULL)
  168. {
  169. //查询接口
  170. ASSERT(QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IIPCRecvDataSink) != NULL);
  171. m_pIIPCRecvDataSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IIPCRecvDataSink);
  172. //成功判断
  173. if (m_pIIPCRecvDataSink == NULL) return false;
  174. }
  175. else m_pIIPCRecvDataSink = NULL;
  176. return true;
  177. }
  178. //消息处理
  179. bool CProcessRecvData::OnCopyData(HWND hWndSend, COPYDATASTRUCT * pCopyDataStruct)
  180. {
  181. //效验接口
  182. ASSERT(m_pIIPCRecvDataSink != NULL);
  183. if (m_pIIPCRecvDataSink == NULL) return false;
  184. //效验参数
  185. ASSERT(pCopyDataStruct->cbData >= sizeof(IPC_Head));
  186. if (pCopyDataStruct->cbData < sizeof(IPC_Head)) return false;
  187. //效验数据
  188. IPC_Head * pHead = (IPC_Head *)pCopyDataStruct->lpData;
  189. ASSERT((pHead->wVersion == IPC_VER) && (pHead->wPacketSize == pCopyDataStruct->cbData));
  190. if ((pHead->wVersion != IPC_VER) || (pHead->wPacketSize != pCopyDataStruct->cbData)) return false;
  191. //数据处理
  192. switch (pCopyDataStruct->dwData)
  193. {
  194. case IDT_IMMEDIATE: //同步数据
  195. {
  196. //数据处理
  197. WORD wDataSize = pHead->wPacketSize - sizeof(IPC_Head);
  198. m_pIIPCRecvDataSink->OnImmediateData(pHead->wMainCmdID, pHead->wSubCmdID, pHead + 1, wDataSize, hWndSend);
  199. return true;
  200. }
  201. case IDT_ASYNCHRONISM: //异步数据
  202. {
  203. //数据处理
  204. WORD wDataSize = pHead->wPacketSize - sizeof(IPC_Head);
  205. m_pIIPCRecvDataSink->OnAsynchronismData(pHead->wMainCmdID, pHead->wSubCmdID, pHead + 1, wDataSize, hWndSend);
  206. return true;
  207. }
  208. }
  209. return false;
  210. }
  211. //////////////////////////////////////////////////////////////////////////////////