|
- #include "StdAfx.h"
- #include "ProcessControl.h"
-
- //////////////////////////////////////////////////////////////////////////////////
- //宏定义
-
- //标识定义
- #define IDC_PROCESS_CONTROL 100 //窗口标识
-
- //消息定义
- #define WM_ASYNCHRONISM_DATA (WM_USER+100) //异步数据
-
- //////////////////////////////////////////////////////////////////////////////////
-
- //异步数据
- struct tagAsynchronismData
- {
- HWND hWndSend; //发送窗口
- WORD wDataSize; //数据大小
- WORD wSubCmdID; //子命令码
- WORD wMainCmdID; //主命令码
- BYTE cbBuffer[IPC_PACKET]; //数据缓冲
- };
-
- //////////////////////////////////////////////////////////////////////////////////
-
- BEGIN_MESSAGE_MAP(CProcessControl, CWnd)
- ON_WM_COPYDATA()
- ON_MESSAGE(WM_ASYNCHRONISM_DATA, OnMessageAsynchronismData)
- END_MESSAGE_MAP()
-
- //////////////////////////////////////////////////////////////////////////////////
-
- //构造函数
- CProcessControl::CProcessControl()
- {
- //设置变量
- m_pIProcessControlSink = NULL;
-
- return;
- }
-
- //析构函数
- CProcessControl::~CProcessControl()
- {
- }
-
- //接口查询
- VOID * CProcessControl::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
- {
- QUERYINTERFACE(IProcessControl, Guid, dwQueryVer);
- QUERYINTERFACE_IUNKNOWNEX(IProcessControl, Guid, dwQueryVer);
- return NULL;
- }
-
- //获取句柄
- HWND CProcessControl::GetProcessControlWnd()
- {
- return m_hWnd;
- }
-
- //创建通讯
- bool CProcessControl::SetProcessControlSink(IUnknownEx * pIUnknownEx)
- {
- //设置接口
- if (pIUnknownEx != NULL)
- {
- //查询接口
- ASSERT(QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IProcessControlSink) != NULL);
- m_pIProcessControlSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IProcessControlSink);
-
- //成功判断
- if (m_pIProcessControlSink == NULL) return false;
- }
- else m_pIProcessControlSink = NULL;
-
- return true;
- }
-
- //配置连接
- bool CProcessControl::InitializeLink()
- {
- //效验参数
- ASSERT(m_pIProcessControlSink != NULL);
- if (m_pIProcessControlSink == NULL) return false;
-
- //创建窗口
- if (m_hWnd == NULL)
- {
- CRect rcCreate(0, 0, 0, 0);
- Create(NULL, NULL, WS_CHILD, rcCreate, GetDesktopWindow(), IDC_PROCESS_CONTROL);
- }
-
- return true;
- }
-
- //销毁通讯
- bool CProcessControl::UnInitializeLink()
- {
- //清理队列
- m_DataQueue.RemoveData(false);
-
- //关闭窗口
- if (m_hWnd != NULL) DestroyWindow();
-
- return true;
- }
-
- //发送数据
- bool CProcessControl::SendData(HWND hWndServer, WORD wMainCmdID, WORD wSubCmdID)
- {
- //效验参数
- if (IsWindow(m_hWnd) == FALSE) return false;
- if (IsWindow(hWndServer) == FALSE) return false;
-
- //构造数据
- IPC_Head IPCHead;
- IPCHead.wVersion = IPC_VER;
- IPCHead.wSubCmdID = wSubCmdID;
- IPCHead.wMainCmdID = wMainCmdID;
- IPCHead.wPacketSize = sizeof(IPC_Head);
-
- //发送数据
- COPYDATASTRUCT CopyDataStruct;
- CopyDataStruct.lpData = &IPCHead;
- CopyDataStruct.dwData = IDT_ASYNCHRONISM;
- CopyDataStruct.cbData = IPCHead.wPacketSize;
- ::SendMessage(hWndServer, WM_COPYDATA, (LPARAM)m_hWnd, (WPARAM)&CopyDataStruct);
-
- return true;
- }
-
- //发送数据
- bool CProcessControl::SendData(HWND hWndServer, WORD wMainCmdID, WORD wSubCmdID, VOID * const pData, WORD wDataSize)
- {
- //效验参数
- if (IsWindow(m_hWnd) == FALSE) return false;
- if (IsWindow(hWndServer) == FALSE) return false;
-
- //构造数据
- IPC_Buffer IPCBuffer;
- IPCBuffer.Head.wVersion = IPC_VER;
- IPCBuffer.Head.wSubCmdID = wSubCmdID;
- IPCBuffer.Head.wMainCmdID = wMainCmdID;
- IPCBuffer.Head.wPacketSize = sizeof(IPCBuffer.Head);
-
- //附加数据
- if (pData != NULL)
- {
- //效验长度
- ASSERT(wDataSize <= sizeof(IPCBuffer.cbBuffer));
- if (wDataSize > sizeof(IPCBuffer.cbBuffer)) return false;
-
- //拷贝数据
- IPCBuffer.Head.wPacketSize += wDataSize;
- CopyMemory(IPCBuffer.cbBuffer, pData, wDataSize);
- }
-
- //发送数据
- COPYDATASTRUCT CopyDataStruct;
- CopyDataStruct.lpData = &IPCBuffer;
- CopyDataStruct.dwData = IDT_ASYNCHRONISM;
- CopyDataStruct.cbData = IPCBuffer.Head.wPacketSize;
- ::SendMessage(hWndServer, WM_COPYDATA, (LPARAM)m_hWnd, (WPARAM)&CopyDataStruct);
-
- return true;
- }
-
- //执行命令
- bool CProcessControl::SendCommand(HWND hWndServer, WORD wMainCmdID, WORD wSubCmdID, VOID * const pData, WORD wDataSize)
- {
- //效验参数
- if (IsWindow(m_hWnd) == FALSE) return false;
- if (IsWindow(hWndServer) == FALSE) return false;
-
- //构造数据
- IPC_Buffer IPCBuffer;
- IPCBuffer.Head.wVersion = IPC_VER;
- IPCBuffer.Head.wSubCmdID = wSubCmdID;
- IPCBuffer.Head.wMainCmdID = wMainCmdID;
- IPCBuffer.Head.wPacketSize = sizeof(IPCBuffer.Head);
-
- //附加数据
- if (pData != NULL)
- {
- //效验长度
- ASSERT(wDataSize <= sizeof(IPCBuffer.cbBuffer));
- if (wDataSize > sizeof(IPCBuffer.cbBuffer)) return false;
-
- //拷贝数据
- IPCBuffer.Head.wPacketSize += wDataSize;
- CopyMemory(IPCBuffer.cbBuffer, pData, wDataSize);
- }
-
- //发送数据
- COPYDATASTRUCT CopyDataStruct;
- CopyDataStruct.lpData = &IPCBuffer;
- CopyDataStruct.dwData = IDT_IMMEDIATE;
- CopyDataStruct.cbData = IPCBuffer.Head.wPacketSize;
- ::SendMessage(hWndServer, WM_COPYDATA, (LPARAM)m_hWnd, (WPARAM)&CopyDataStruct);
-
- return true;
- }
-
- //IPC 消息
- BOOL CProcessControl::OnCopyData(CWnd * pWnd, COPYDATASTRUCT * pCopyDataStruct)
- {
- //效验接口
- ASSERT(m_pIProcessControlSink != NULL);
- if (m_pIProcessControlSink == NULL) return FALSE;
-
- //效验参数
- ASSERT(pCopyDataStruct->cbData >= sizeof(IPC_Head));
- if (pCopyDataStruct->cbData < sizeof(IPC_Head)) return FALSE;
-
- //效验数据
- IPC_Head * pHead = (IPC_Head *)pCopyDataStruct->lpData;
- ASSERT((pHead->wVersion == IPC_VER) && (pHead->wPacketSize == pCopyDataStruct->cbData));
- if ((pHead->wVersion != IPC_VER) || (pHead->wPacketSize != pCopyDataStruct->cbData)) return FALSE;
-
- //数据处理
- switch (pCopyDataStruct->dwData)
- {
- case IDT_IMMEDIATE: //同步数据
- {
- //数据处理
- WORD wDataSize = pHead->wPacketSize - sizeof(IPC_Head);
- m_pIProcessControlSink->OnProcessControlData(pHead->wMainCmdID, pHead->wSubCmdID, pHead + 1, wDataSize, pWnd->m_hWnd);
-
- return true;
- }
- case IDT_ASYNCHRONISM: //异步数据
- {
- //构造数据
- tagAsynchronismData AsynchronismData;
- AsynchronismData.wSubCmdID = pHead->wSubCmdID;
- AsynchronismData.wMainCmdID = pHead->wMainCmdID;
- AsynchronismData.hWndSend = pWnd->GetSafeHwnd();
- AsynchronismData.wDataSize = pHead->wPacketSize - sizeof(IPC_Head);
- CopyMemory(&AsynchronismData.cbBuffer, pHead + 1, pHead->wPacketSize - sizeof(IPC_Head));
-
- //插入数据
- WORD wHeadSize = sizeof(AsynchronismData)-sizeof(AsynchronismData.cbBuffer);
- m_DataQueue.InsertData(IDT_ASYNCHRONISM, &AsynchronismData, wHeadSize + AsynchronismData.wDataSize);
-
- //投递消息
- ASSERT(pWnd != NULL);
- if (pWnd != NULL) PostMessage(WM_ASYNCHRONISM_DATA, (WPARAM)(pWnd->m_hWnd), (LPARAM)(pHead->wPacketSize));
-
- return true;
- }
- }
-
- return TRUE;
- }
-
- //通知消息
- LRESULT CProcessControl::OnMessageAsynchronismData(WPARAM wParam, LPARAM lParam)
- {
- //提取数据
- tagDataHead DataHead;
- tagAsynchronismData AsynchronismData;
- if (m_DataQueue.DistillData(DataHead, &AsynchronismData, sizeof(AsynchronismData)) == false)
- {
- ASSERT(FALSE);
- return 0;
- }
-
- //状态效验
- ASSERT(m_pIProcessControlSink != NULL);
- if (m_pIProcessControlSink == NULL) return 0;
-
- //数据处理
- HWND hWndClient = AsynchronismData.hWndSend;
- WORD wSubCmdID = AsynchronismData.wSubCmdID;
- WORD wMainCmdID = AsynchronismData.wMainCmdID;
- m_pIProcessControlSink->OnProcessControlData(wMainCmdID, wSubCmdID, AsynchronismData.cbBuffer, AsynchronismData.wDataSize, hWndClient);
-
- return 0;
- }
-
- //////////////////////////////////////////////////////////////////////////////////
-
- //组件创建函数
- DECLARE_CREATE_MODULE(ProcessControl);
-
- //////////////////////////////////////////////////////////////////////////////////
|