Bladeren bron

使用回调函数:在Connect成功或失败时,回调到PageDebug窗口处理。

JeffWang 3 jaren geleden
bovenliggende
commit
256c2a37de

+ 24 - 5
Source/OGCAssistTool/OGCAssistTool/PageDebug.cpp

@@ -17,12 +17,13 @@ extern HWND g_hWnd_Channel;
 extern BOOL StartOGCTool();
 // CDlgDebug 对话框
 
+CPageDebug *CPageDebug::m_pDlg = NULL;
 IMPLEMENT_DYNAMIC(CPageDebug, CDialogEx)
 
 CPageDebug::CPageDebug(CWnd* pParent /*=NULL*/)
 	: CDialogEx(CPageDebug::IDD, pParent)
 {
-
+	m_pDlg = this;
 }
 
 CPageDebug::~CPageDebug()
@@ -56,6 +57,9 @@ BOOL CPageDebug::OnInitDialog()
 	//SetBackgroundColor(RGB(255,255,255));
 	SetBackgroundColor(RGB(200,200,200));
 	InitListCtrl();
+
+	GLOBAL::g_IOCP.SetCallBack(ConnectProc, NULL, NULL, NULL);
+
 	return TRUE;  // return TRUE unless you set the focus to a control
 	// 异常: OCX 属性页应返回 FALSE
 }
@@ -127,6 +131,14 @@ HWND MyFindWindow(LPCTSTR lpClassName)
 	return hWnd;
 }
 
+BOOL CPageDebug::ConnectProc(MSG_INFO *pMsg)
+{
+	if ( m_pDlg == NULL )
+		return FALSE;
+
+	m_pDlg->SetDlgItemText(BTN_CONNECT, pMsg->byResult ? _T("断开连接") : _T("连接设备"));
+}
+
 void CPageDebug::OnBnClickedShowWnd()
 {
 	// TODO: 在此添加控件通知处理程序代码
@@ -252,7 +264,7 @@ void CPageDebug::OnBnClickedConnect()
 					}
 
 					SetDlgItemText(BTN_CONNECT, _T("连接中……"));
-					SetTimer(0, 500, NULL);
+					//SetTimer(0, 500, NULL);
 				}
 				else
 				{
@@ -286,6 +298,9 @@ void CPageDebug::OnTimer(UINT_PTR nIDEvent)
 	{
 	case 0:
 		{
+			// 应该回调函数实现;
+			Sleep(3000);
+
 			if ( GLOBAL::g_procWndInfo.bConnectStatus )
 			{
 				//GetDlgItem(BTN_CONNECT)->EnableWindow(FALSE);
@@ -298,14 +313,18 @@ void CPageDebug::OnTimer(UINT_PTR nIDEvent)
 					Sleep(20);
 					::PostMessage(hWnd, WM_LBUTTONUP, 0, 0);
 				}
-
-				KillTimer(nIDEvent);
 			}
+			else
+			{
+				SetDlgItemText(BTN_CONNECT, _T("连接设备"));
+			}
+
+			KillTimer(nIDEvent);
 		}
 		break;
 	case 1:
 		{
-			if ( GLOBAL::g_procWndInfo )
+			if ( GLOBAL::g_procWndInfo.dwProcId )
 			{
 
 			}

+ 2 - 0
Source/OGCAssistTool/OGCAssistTool/PageDebug.h

@@ -36,6 +36,8 @@ public:
 
 		SetDlgItemText(BTN_SHOW_WND, nCmdShow == SW_SHOW ? _T("Òþ²Ø´°¿Ú") : _T("ÏÔʾ´°¿Ú"));
 	}
+	static CPageDebug *m_pDlg;
+	static BOOL CALLBACK ConnectProc(MSG_INFO *pMsg);
 	afx_msg void OnBnClickedShowWnd();
 	afx_msg void OnBnClickedHijack();
 	afx_msg void OnBnClickedTest();

+ 6 - 6
Source/OGCAssistTool/OGCAssistTool/PipeService.cpp

@@ -24,6 +24,7 @@
 OnConnectCallback CIOCPPipe::lpOnConnectCallback = NULL;
 OnDisconnectCallback CIOCPPipe::lpOnDisconnectCallback = NULL;
 OnReciveCallback CIOCPPipe::lpOnReciveCallback = NULL;
+OnGoCallback CIOCPPipe::lpOnGoCallback = NULL;
 
 CIOCPPipe::CIOCPPipe(void)
 {
@@ -114,12 +115,6 @@ DWORD WINAPI CIOCPPipe::_WorkerThread(LPVOID lpParam)
 					{
 						dprintf(_T("客户端连接成功"));
 						pIOCPModel->DoAccpet( pPipeContext, pIoContext );
-                        
-						// 发送第一个请求:回调处理;
-						if ( lpOnConnectCallback )
-						{
-							lpOnConnectCallback(pIoContext);
-						}
 					}
 					break;
 				case OP_RECV:
@@ -498,6 +493,11 @@ void CIOCPPipe::RecvProcess(PER_PIPE_CONTEXT* pPipeContext, PER_IO_CONTEXT* pIoC
 			{
 				dprintf(_T("接收到客户端消息:连接"));
 				GLOBAL::g_procWndInfo.bConnectStatus = msg_info.byResult;
+				// 发送第一个请求:回调处理;
+				if ( lpOnConnectCallback )
+				{
+					lpOnConnectCallback(&msg_info);
+				}
 			}
 			break;
 		case C2S_DISCONNECT:

+ 11 - 3
Source/OGCAssistTool/OGCAssistTool/PipeService.h

@@ -1,5 +1,7 @@
 #pragma once
 
+#include "Protocol.h"
+
 #define CONNECTING_STATE 0
 #define READING_STATE 1
 #define WRITING_STATE 2
@@ -143,11 +145,13 @@ typedef struct _PER_PIPE_CONTEXT
 }PER_PIPE_CONTEXT, *PPER_PIPE_CONTEXT;
 
 // 回调客户端接入时;
-typedef BOOL(CALLBACK *OnConnectCallback)(PER_IO_CONTEXT* pIoContext);
+typedef BOOL(CALLBACK *OnGoCallback)(MSG_INFO* pIoContext);
+// 回调客户端接入时;
+typedef BOOL(CALLBACK *OnConnectCallback)(MSG_INFO* pIoContext);
 // 回调客户端断开时;
 typedef BOOL(CALLBACK* OnDisconnectCallback)(PER_IO_CONTEXT* pIoContext);
 // 回调客户端消息到来时;
-typedef BOOL(CALLBACK *OnReciveCallback)(PER_PIPE_CONTEXT *pPipeContext, PPER_IO_CONTEXT *pIoContext);
+typedef BOOL(CALLBACK *OnReciveCallback)(PER_PIPE_CONTEXT *pPipeContext, PER_IO_CONTEXT *pIoContext);
 
 // 工作者线程的线程参数
 class CIOCPPipe;
@@ -176,7 +180,7 @@ public:
 	// 向客户端发送消息;
 	bool SendMessage();
 	// SetCallback;
-	static void SetCallBack(LPVOID lpOnConnect, LPVOID lpOnDisconnect, LPVOID lpOnRecive)
+	static void SetCallBack(LPVOID lpOnConnect, LPVOID lpOnDisconnect, LPVOID lpOnGo, LPVOID lpOnRecive)
 	{
 		if ( lpOnConnectCallback == NULL )
 			lpOnConnectCallback = (OnConnectCallback)lpOnConnect;
@@ -184,6 +188,9 @@ public:
 		if ( lpOnDisconnectCallback == NULL )
 			lpOnDisconnectCallback = (OnDisconnectCallback)lpOnDisconnect;
 
+		if ( lpOnGoCallback == NULL )
+			lpOnGoCallback = (OnGoCallback)lpOnGo;
+
 		if ( lpOnReciveCallback == NULL )
 			lpOnReciveCallback = (OnReciveCallback)lpOnRecive;
 	}
@@ -224,6 +231,7 @@ protected:
 private:
 	static OnConnectCallback lpOnConnectCallback;
 	static OnDisconnectCallback lpOnDisconnectCallback;
+	static OnGoCallback lpOnGoCallback;
 	static OnReciveCallback lpOnReciveCallback;
     HANDLE m_hShutdownEvent; // 用来通知线程系统退出的事件,为了能够更好的退出线程
     HANDLE m_hIOCompletionPort; // 完成端口的句柄

+ 1 - 0
Source/OGCAssistTool/OGCAssistTool/Protocol.h

@@ -1,3 +1,4 @@
+#pragma once
 #define NAME_LEN 128
 #define DATA_LEN 256