From 9567d059b262c92df74d0a01040de805d65059b1 Mon Sep 17 00:00:00 2001
From: zhongyang219 <380526481@qq.com>
Date: Fri, 27 Aug 2021 11:54:35 +0800
Subject: [PATCH] =?UTF-8?q?=E6=8F=92=E4=BB=B6=E6=B7=BB=E5=8A=A0=E9=80=89?=
=?UTF-8?q?=E9=A1=B9=E8=AE=BE=E7=BD=AE=E6=8E=A5=E5=8F=A3=EF=BC=9B=E6=B7=BB?=
=?UTF-8?q?=E5=8A=A0=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86=E7=95=8C=E9=9D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
PluginDemo/OptionsDlg.cpp | 34 +++++
PluginDemo/OptionsDlg.h | 23 ++++
PluginDemo/PluginDemo.h | 1 +
PluginDemo/PluginDemo.rc | 106 +++++++++++++++
PluginDemo/PluginDemo.vcxproj | 10 ++
PluginDemo/PluginDemo.vcxproj.filters | 14 ++
PluginDemo/dllmain.cpp | 42 +++---
PluginDemo/framework.h | 20 ++-
PluginDemo/pch.h | 2 +
PluginDemo/resource.h | 17 +++
TrafficMonitor/BaseDialog.cpp | 7 +
TrafficMonitor/BaseDialog.h | 1 +
TrafficMonitor/GeneralSettingsDlg.cpp | 14 +-
TrafficMonitor/GeneralSettingsDlg.h | 2 +
TrafficMonitor/PluginManager.cpp | 1 +
TrafficMonitor/PluginManager.h | 2 +
TrafficMonitor/PluginManagerDlg.cpp | 127 ++++++++++++++++++
TrafficMonitor/PluginManagerDlg.h | 36 +++++
TrafficMonitor/Test.cpp | 14 ++
TrafficMonitor/Test.h | 2 +
TrafficMonitor/TrafficMonitor.cpp | 4 +
TrafficMonitor/TrafficMonitor.rc | Bin 275604 -> 278654 bytes
TrafficMonitor/TrafficMonitor.vcxproj | 3 +
TrafficMonitor/TrafficMonitor.vcxproj.filters | 12 ++
TrafficMonitor/TrafficMonitorDlg.cpp | 17 +++
TrafficMonitor/TrafficMonitorDlg.h | 1 +
TrafficMonitor/res/menu_icon/plugins.ico | Bin 0 -> 9622 bytes
TrafficMonitor/resource.h | 18 ++-
28 files changed, 506 insertions(+), 24 deletions(-)
create mode 100644 PluginDemo/OptionsDlg.cpp
create mode 100644 PluginDemo/OptionsDlg.h
create mode 100644 PluginDemo/PluginDemo.rc
create mode 100644 PluginDemo/resource.h
create mode 100644 TrafficMonitor/PluginManagerDlg.cpp
create mode 100644 TrafficMonitor/PluginManagerDlg.h
create mode 100644 TrafficMonitor/res/menu_icon/plugins.ico
diff --git a/PluginDemo/OptionsDlg.cpp b/PluginDemo/OptionsDlg.cpp
new file mode 100644
index 000000000..2de61fff7
--- /dev/null
+++ b/PluginDemo/OptionsDlg.cpp
@@ -0,0 +1,34 @@
+// OptionsDlg.cpp: 实现文件
+//
+
+#include "pch.h"
+#include "PluginDemo.h"
+#include "OptionsDlg.h"
+#include "afxdialogex.h"
+
+
+// COptionsDlg 对话框
+
+IMPLEMENT_DYNAMIC(COptionsDlg, CDialog)
+
+COptionsDlg::COptionsDlg(CWnd* pParent /*=nullptr*/)
+ : CDialog(IDD_OPTIONS_DIALOG, pParent)
+{
+
+}
+
+COptionsDlg::~COptionsDlg()
+{
+}
+
+void COptionsDlg::DoDataExchange(CDataExchange* pDX)
+{
+ CDialog::DoDataExchange(pDX);
+}
+
+
+BEGIN_MESSAGE_MAP(COptionsDlg, CDialog)
+END_MESSAGE_MAP()
+
+
+// COptionsDlg 消息处理程序
diff --git a/PluginDemo/OptionsDlg.h b/PluginDemo/OptionsDlg.h
new file mode 100644
index 000000000..78284e8dd
--- /dev/null
+++ b/PluginDemo/OptionsDlg.h
@@ -0,0 +1,23 @@
+#pragma once
+
+
+// COptionsDlg 对话框
+
+class COptionsDlg : public CDialog
+{
+ DECLARE_DYNAMIC(COptionsDlg)
+
+public:
+ COptionsDlg(CWnd* pParent = nullptr); // 标准构造函数
+ virtual ~COptionsDlg();
+
+// 对话框数据
+#ifdef AFX_DESIGN_TIME
+ enum { IDD = IDD_OPTIONS_DIALOG };
+#endif
+
+protected:
+ virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
+
+ DECLARE_MESSAGE_MAP()
+};
diff --git a/PluginDemo/PluginDemo.h b/PluginDemo/PluginDemo.h
index 06c0c173b..89b27d8d9 100644
--- a/PluginDemo/PluginDemo.h
+++ b/PluginDemo/PluginDemo.h
@@ -7,6 +7,7 @@ extern "C" {
__declspec(dllexport) IPluginItem* TMPluginCreateInstance(int index);
__declspec(dllexport) void TMPluginInfoRequired();
+ __declspec(dllexport) void TMPluginOptions();
#ifdef __cplusplus
}
diff --git a/PluginDemo/PluginDemo.rc b/PluginDemo/PluginDemo.rc
new file mode 100644
index 000000000..441f402c4
--- /dev/null
+++ b/PluginDemo/PluginDemo.rc
@@ -0,0 +1,106 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "winres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// (壬й) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
+LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
+#pragma code_page(936)
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+ "#include ""winres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_OPTIONS_DIALOG DIALOGEX 0, 0, 310, 178
+STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "ʱں"
+FONT 9, "ź", 400, 0, 0x0
+BEGIN
+ DEFPUSHBUTTON "ȷ",IDOK,199,157,50,14
+ PUSHBUTTON "ȡ",IDCANCEL,253,157,50,14
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO
+BEGIN
+ IDD_OPTIONS_DIALOG, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 303
+ TOPMARGIN, 7
+ BOTTOMMARGIN, 171
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// AFX_DIALOG_LAYOUT
+//
+
+IDD_OPTIONS_DIALOG AFX_DIALOG_LAYOUT
+BEGIN
+ 0
+END
+
+#endif // (壬й) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/PluginDemo/PluginDemo.vcxproj b/PluginDemo/PluginDemo.vcxproj
index 4f70113c7..c0a9fec79 100644
--- a/PluginDemo/PluginDemo.vcxproj
+++ b/PluginDemo/PluginDemo.vcxproj
@@ -31,6 +31,7 @@
true
v142
Unicode
+ Dynamic
DynamicLibrary
@@ -38,12 +39,14 @@
v142
true
Unicode
+ Dynamic
DynamicLibrary
true
v142
Unicode
+ Dynamic
DynamicLibrary
@@ -51,6 +54,7 @@
v142
true
Unicode
+ Dynamic
@@ -162,14 +166,17 @@
+
+
+
Create
Create
@@ -179,6 +186,9 @@
+
+
+
diff --git a/PluginDemo/PluginDemo.vcxproj.filters b/PluginDemo/PluginDemo.vcxproj.filters
index ff4dcdb8a..e7d435353 100644
--- a/PluginDemo/PluginDemo.vcxproj.filters
+++ b/PluginDemo/PluginDemo.vcxproj.filters
@@ -36,6 +36,12 @@
头文件
+
+ 头文件
+
+
+ 头文件
+
@@ -53,5 +59,13 @@
源文件
+
+ 源文件
+
+
+
+
+ 资源文件
+
\ No newline at end of file
diff --git a/PluginDemo/dllmain.cpp b/PluginDemo/dllmain.cpp
index ae0709bc5..dfd0cf45c 100644
--- a/PluginDemo/dllmain.cpp
+++ b/PluginDemo/dllmain.cpp
@@ -4,26 +4,28 @@
#include "PluginSystemTime.h"
#include "PluginDemo.h"
#include "DataManager.h"
+#include "OptionsDlg.h"
-
-BOOL APIENTRY DllMain( HMODULE hModule,
- DWORD ul_reason_for_call,
- LPVOID lpReserved
- )
-{
- switch (ul_reason_for_call)
- {
- case DLL_PROCESS_ATTACH:
- case DLL_THREAD_ATTACH:
- case DLL_THREAD_DETACH:
- case DLL_PROCESS_DETACH:
- break;
- }
- return TRUE;
-}
+//BOOL APIENTRY DllMain( HMODULE hModule,
+// DWORD ul_reason_for_call,
+// LPVOID lpReserved
+// )
+//{
+// switch (ul_reason_for_call)
+// {
+// case DLL_PROCESS_ATTACH:
+// case DLL_THREAD_ATTACH:
+// case DLL_THREAD_DETACH:
+// case DLL_PROCESS_DETACH:
+// break;
+// }
+// return TRUE;
+//}
IPluginItem* TMPluginCreateInstance(int index)
{
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+
switch (index)
{
case 0:
@@ -38,6 +40,7 @@ IPluginItem* TMPluginCreateInstance(int index)
void TMPluginInfoRequired()
{
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
//获取时间和日期
SYSTEMTIME system_time;
GetSystemTime(&system_time);
@@ -47,3 +50,10 @@ void TMPluginInfoRequired()
swprintf_s(buff, L"%.2d:%.2d:%.2d", system_time.wHour, system_time.wMinute, system_time.wSecond);
CDataManager::Instance().m_cur_time = buff;
}
+
+void TMPluginOptions()
+{
+ AFX_MANAGE_STATE(AfxGetStaticModuleState());
+ COptionsDlg dlg;
+ dlg.DoModal();
+}
diff --git a/PluginDemo/framework.h b/PluginDemo/framework.h
index 80cbbc9b0..b09f35a4b 100644
--- a/PluginDemo/framework.h
+++ b/PluginDemo/framework.h
@@ -1,5 +1,21 @@
#pragma once
#define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容
-// Windows 头文件
-#include
+//// Windows 头文件
+//#include
+
+#include
+
+#include // MFC 核心组件和标准组件
+#include // MFC 扩展
+#include // MFC 自动化类
+
+#ifdef _UNICODE
+#if defined _M_IX86
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
+#elif defined _M_X64
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
+#else
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
+#endif
+#endif
diff --git a/PluginDemo/pch.h b/PluginDemo/pch.h
index 966092717..370adca7f 100644
--- a/PluginDemo/pch.h
+++ b/PluginDemo/pch.h
@@ -10,4 +10,6 @@
// 添加要在此处预编译的标头
#include "framework.h"
+#include "resource.h"
+
#endif //PCH_H
diff --git a/PluginDemo/resource.h b/PluginDemo/resource.h
new file mode 100644
index 000000000..4af258260
--- /dev/null
+++ b/PluginDemo/resource.h
@@ -0,0 +1,17 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ 生成的包含文件。
+// 供 PluginDemo.rc 使用
+//
+#define IDD_DIALOG1 101
+#define IDD_OPTIONS_DIALOG 101
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 103
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1001
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/TrafficMonitor/BaseDialog.cpp b/TrafficMonitor/BaseDialog.cpp
index 98dd236cb..0e923f017 100644
--- a/TrafficMonitor/BaseDialog.cpp
+++ b/TrafficMonitor/BaseDialog.cpp
@@ -44,6 +44,13 @@ void CBaseDialog::SaveConfig() const
ini.Save();
}
+void CBaseDialog::EnableDlgCtrl(UINT id, bool enable)
+{
+ CWnd* pWnd = GetDlgItem(id);
+ if (pWnd != nullptr)
+ pWnd->EnableWindow(enable);
+}
+
void CBaseDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
diff --git a/TrafficMonitor/BaseDialog.h b/TrafficMonitor/BaseDialog.h
index 4136f48d5..6231e7dce 100644
--- a/TrafficMonitor/BaseDialog.h
+++ b/TrafficMonitor/BaseDialog.h
@@ -30,6 +30,7 @@ class CBaseDialog : public CDialog
protected:
virtual CString GetDialogName() const = 0;
+ void EnableDlgCtrl(UINT id, bool enable);
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
diff --git a/TrafficMonitor/GeneralSettingsDlg.cpp b/TrafficMonitor/GeneralSettingsDlg.cpp
index 8840f2932..f9806edf8 100644
--- a/TrafficMonitor/GeneralSettingsDlg.cpp
+++ b/TrafficMonitor/GeneralSettingsDlg.cpp
@@ -4,7 +4,7 @@
#include "stdafx.h"
#include "TrafficMonitor.h"
#include "GeneralSettingsDlg.h"
-#include "afxdialogex.h"
+#include "PluginManagerDlg.h"
// CGeneralSettingsDlg dialog
@@ -89,6 +89,7 @@ void CGeneralSettingsDlg::DoDataExchange(CDataExchange* pDX)
DDX_Control(pDX, IDC_MBD_TEMP_TIP_EDIT, m_mbd_temp_tip_edit);
DDX_Control(pDX, IDC_SELECT_HARD_DISK_COMBO, m_hard_disk_combo);
DDX_Control(pDX, IDC_SELECT_CPU_COMBO, m_select_cpu_combo);
+ DDX_Control(pDX, IDC_PLUGIN_MANAGE_BUTTON, m_plugin_manager_btn);
}
void CGeneralSettingsDlg::SetControlEnable()
@@ -133,6 +134,7 @@ BEGIN_MESSAGE_MAP(CGeneralSettingsDlg, CTabDlg)
ON_BN_CLICKED(IDC_HDD_CHECK, &CGeneralSettingsDlg::OnBnClickedHddCheck)
ON_BN_CLICKED(IDC_MBD_CHECK, &CGeneralSettingsDlg::OnBnClickedMbdCheck)
ON_CBN_SELCHANGE(IDC_SELECT_CPU_COMBO, &CGeneralSettingsDlg::OnCbnSelchangeSelectCpuCombo)
+ ON_BN_CLICKED(IDC_PLUGIN_MANAGE_BUTTON, &CGeneralSettingsDlg::OnBnClickedPluginManageButton)
END_MESSAGE_MAP()
@@ -269,6 +271,8 @@ BOOL CGeneralSettingsDlg::OnInitDialog()
EnableDlgCtrl(IDC_SELECT_CPU_COMBO, false);
#endif
+ m_plugin_manager_btn.SetIcon(theApp.GetMenuIcon(IDI_PLUGINS));
+
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
@@ -610,3 +614,11 @@ void CGeneralSettingsDlg::OnCbnSelchangeSelectCpuCombo()
m_select_cpu_combo.GetWindowText(cpu_core_name);
m_data.cpu_core_name = cpu_core_name.GetString();
}
+
+
+void CGeneralSettingsDlg::OnBnClickedPluginManageButton()
+{
+ // TODO: 在此添加控件通知处理程序代码
+ CPluginManagerDlg dlg;
+ dlg.DoModal();
+}
diff --git a/TrafficMonitor/GeneralSettingsDlg.h b/TrafficMonitor/GeneralSettingsDlg.h
index d0363e044..e16afd2c0 100644
--- a/TrafficMonitor/GeneralSettingsDlg.h
+++ b/TrafficMonitor/GeneralSettingsDlg.h
@@ -93,4 +93,6 @@ class CGeneralSettingsDlg : public CTabDlg
afx_msg void OnBnClickedHddCheck();
afx_msg void OnBnClickedMbdCheck();
afx_msg void OnCbnSelchangeSelectCpuCombo();
+ afx_msg void OnBnClickedPluginManageButton();
+ CButton m_plugin_manager_btn;
};
diff --git a/TrafficMonitor/PluginManager.cpp b/TrafficMonitor/PluginManager.cpp
index 90ab1110c..6956fae9b 100644
--- a/TrafficMonitor/PluginManager.cpp
+++ b/TrafficMonitor/PluginManager.cpp
@@ -37,6 +37,7 @@ void CPluginManager::LoadPlugins()
plugin_info.error_code = GetLastError();
continue;
}
+ plugin_info.TMPluginOptions = (pfTMPluginOptions)::GetProcAddress(plugin_info.plugin_module, "TMPluginOptions");
int index = 0;
while (true)
{
diff --git a/TrafficMonitor/PluginManager.h b/TrafficMonitor/PluginManager.h
index df116e96f..ecdc149f2 100644
--- a/TrafficMonitor/PluginManager.h
+++ b/TrafficMonitor/PluginManager.h
@@ -4,6 +4,7 @@
typedef IPluginItem* (*pfTMPluginCreateInstance)(int);
typedef void (*pfTMPluginInfoRequired)();
+typedef void (*pfTMPluginOptions)();
//用于加载和管理插件
class CPluginManager
@@ -26,6 +27,7 @@ class CPluginManager
PluginState state{}; //插件的状态
DWORD error_code{}; //错误代码(GetLastError的返回值)
pfTMPluginInfoRequired MPluginInfoRequired{}; //模块中MPluginInfoRequired函数的指针
+ pfTMPluginOptions TMPluginOptions{}; //模块中TMPluginOptions函数的指针
};
CPluginManager();
diff --git a/TrafficMonitor/PluginManagerDlg.cpp b/TrafficMonitor/PluginManagerDlg.cpp
new file mode 100644
index 000000000..57bd14a92
--- /dev/null
+++ b/TrafficMonitor/PluginManagerDlg.cpp
@@ -0,0 +1,127 @@
+// PluginManagerDlg.cpp: 实现文件
+//
+
+#include "stdafx.h"
+#include "TrafficMonitor.h"
+#include "PluginManagerDlg.h"
+#include "FilePathHelper.h"
+
+
+// CPluginManagerDlg 对话框
+
+IMPLEMENT_DYNAMIC(CPluginManagerDlg, CBaseDialog)
+
+CPluginManagerDlg::CPluginManagerDlg(CWnd* pParent /*=nullptr*/)
+ : CBaseDialog(IDD_PLUGIN_MANAGER_DIALOG, pParent)
+{
+
+}
+
+CPluginManagerDlg::~CPluginManagerDlg()
+{
+}
+
+void CPluginManagerDlg::DoDataExchange(CDataExchange* pDX)
+{
+ CBaseDialog::DoDataExchange(pDX);
+ DDX_Control(pDX, IDC_LIST1, m_list_ctrl);
+}
+
+void CPluginManagerDlg::EnableControl()
+{
+ bool select_enable{ m_item_selected >= 0 && m_item_selected < m_list_ctrl.GetItemCount() };
+ EnableDlgCtrl(IDC_OPTINS_BUTTON, select_enable);
+}
+
+CString CPluginManagerDlg::GetDialogName() const
+{
+ return _T("PluginManagerDlg");
+}
+
+
+BEGIN_MESSAGE_MAP(CPluginManagerDlg, CBaseDialog)
+ ON_NOTIFY(NM_RCLICK, IDC_LIST1, &CPluginManagerDlg::OnNMRClickList1)
+ ON_NOTIFY(NM_CLICK, IDC_LIST1, &CPluginManagerDlg::OnNMClickList1)
+ ON_BN_CLICKED(IDC_OPTINS_BUTTON, &CPluginManagerDlg::OnBnClickedOptinsButton)
+END_MESSAGE_MAP()
+
+
+// CPluginManagerDlg 消息处理程序
+
+
+BOOL CPluginManagerDlg::OnInitDialog()
+{
+ CBaseDialog::OnInitDialog();
+
+ // TODO: 在此添加额外的初始化
+ SetIcon(theApp.GetMenuIcon(IDI_PLUGINS), FALSE);
+
+ //初始化列表控件
+ CRect rect;
+ m_list_ctrl.GetClientRect(rect);
+ m_list_ctrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_LABELTIP);
+ int width0, width1;
+ width0 = rect.Width() / 3;
+ width1 = rect.Width() - width0 - theApp.DPI(20) - 1;
+ m_list_ctrl.InsertColumn(0, CCommon::LoadText(IDS_FILE_NAME), LVCFMT_LEFT, width0);
+ m_list_ctrl.InsertColumn(1, CCommon::LoadText(IDS_STATUS), LVCFMT_LEFT, width1);
+
+ //向列表中插入行
+ for (const auto& plugin : theApp.m_plugins.GetPlugins())
+ {
+ std::wstring file_name = CFilePathHelper(plugin.file_path).GetFileName();
+ CString status;
+ switch (plugin.state)
+ {
+ case CPluginManager::PluginState::PS_SUCCEED:
+ status = _T("加载成功");
+ break;
+ case CPluginManager::PluginState::PS_MUDULE_LOAD_FAILED:
+ status.Format(_T("插件模块加载失败,故障代码:%d"), plugin.error_code);
+ break;
+ case CPluginManager::PluginState::PS_FUNCTION_GET_FAILED:
+ status.Format(_T("函数获取失败,故障代码:%d"), plugin.error_code);
+ break;
+ }
+ int index = m_list_ctrl.GetItemCount();
+ m_list_ctrl.InsertItem(index, file_name.c_str());
+ m_list_ctrl.SetItemText(index, 1, status);
+ }
+
+ EnableControl();
+
+ return TRUE; // return TRUE unless you set the focus to a control
+ // 异常: OCX 属性页应返回 FALSE
+}
+
+
+void CPluginManagerDlg::OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult)
+{
+ LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR);
+ // TODO: 在此添加控件通知处理程序代码
+ m_item_selected = pNMItemActivate->iItem;
+ EnableControl();
+ *pResult = 0;
+}
+
+
+void CPluginManagerDlg::OnNMClickList1(NMHDR* pNMHDR, LRESULT* pResult)
+{
+ LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR);
+ // TODO: 在此添加控件通知处理程序代码
+ m_item_selected = pNMItemActivate->iItem;
+ EnableControl();
+ *pResult = 0;
+}
+
+
+void CPluginManagerDlg::OnBnClickedOptinsButton()
+{
+ // TODO: 在此添加控件通知处理程序代码
+ if (m_item_selected >= 0 && m_item_selected < static_cast(theApp.m_plugins.GetPlugins().size()))
+ {
+ auto plugin = theApp.m_plugins.GetPlugins()[m_item_selected];
+ if (plugin.TMPluginOptions != nullptr)
+ plugin.TMPluginOptions();
+ }
+}
diff --git a/TrafficMonitor/PluginManagerDlg.h b/TrafficMonitor/PluginManagerDlg.h
new file mode 100644
index 000000000..30e383ae4
--- /dev/null
+++ b/TrafficMonitor/PluginManagerDlg.h
@@ -0,0 +1,36 @@
+#pragma once
+#include "BaseDialog.h"
+
+// CPluginManagerDlg 对话框
+
+class CPluginManagerDlg : public CBaseDialog
+{
+ DECLARE_DYNAMIC(CPluginManagerDlg)
+
+public:
+ CPluginManagerDlg(CWnd* pParent = nullptr); // 标准构造函数
+ virtual ~CPluginManagerDlg();
+
+// 对话框数据
+#ifdef AFX_DESIGN_TIME
+ enum { IDD = IDD_PLUGIN_MANAGER_DIALOG };
+#endif
+
+private:
+ CListCtrl m_list_ctrl;
+ int m_item_selected{ -1 };
+
+protected:
+ virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
+ void EnableControl();
+
+ DECLARE_MESSAGE_MAP()
+
+ // 通过 CBaseDialog 继承
+ virtual CString GetDialogName() const override;
+public:
+ virtual BOOL OnInitDialog();
+ afx_msg void OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult);
+ afx_msg void OnNMClickList1(NMHDR* pNMHDR, LRESULT* pResult);
+ afx_msg void OnBnClickedOptinsButton();
+};
diff --git a/TrafficMonitor/Test.cpp b/TrafficMonitor/Test.cpp
index c55607033..ebf64f8ad 100644
--- a/TrafficMonitor/Test.cpp
+++ b/TrafficMonitor/Test.cpp
@@ -2,6 +2,7 @@
#include "Test.h"
#include "Common.h"
#include "SkinFile.h"
+#include "TrafficMonitor.h"
CTest::CTest()
{
@@ -19,6 +20,11 @@ void CTest::Test()
//TestCrash();
}
+void CTest::TestCommand()
+{
+ TestPlugin();
+}
+
void CTest::TestHttpQequest()
{
wstring result;
@@ -56,3 +62,11 @@ void CTest::TestCrash()
printf("%d", a);
}
+
+void CTest::TestPlugin()
+{
+ if (!theApp.m_plugins.GetPlugins().empty())
+ {
+ theApp.m_plugins.GetPlugins()[0].TMPluginOptions();
+ }
+}
diff --git a/TrafficMonitor/Test.h b/TrafficMonitor/Test.h
index 0b2406464..2252cb266 100644
--- a/TrafficMonitor/Test.h
+++ b/TrafficMonitor/Test.h
@@ -6,10 +6,12 @@ class CTest
~CTest();
static void Test();
+ static void TestCommand();
private:
static void TestHttpQequest();
static void TestGetLicense();
static void TestSkin();
static void TestCrash();
+ static void TestPlugin();
};
diff --git a/TrafficMonitor/TrafficMonitor.cpp b/TrafficMonitor/TrafficMonitor.cpp
index f14cc11a4..1e1c35ac7 100644
--- a/TrafficMonitor/TrafficMonitor.cpp
+++ b/TrafficMonitor/TrafficMonitor.cpp
@@ -730,6 +730,7 @@ void CTrafficMonitorApp::InitMenuResourse()
CMenuIcon::AddIconToMenuItem(m_main_menu.GetSafeHmenu(), ID_CHANGE_SKIN, FALSE, GetMenuIcon(IDI_SKIN));
CMenuIcon::AddIconToMenuItem(m_main_menu.GetSafeHmenu(), ID_CHANGE_NOTIFY_ICON, FALSE, GetMenuIcon(IDI_NOTIFY));
CMenuIcon::AddIconToMenuItem(m_main_menu.GetSafeHmenu(), ID_TRAFFIC_HISTORY, FALSE, GetMenuIcon(IDI_STATISTICS));
+ CMenuIcon::AddIconToMenuItem(m_main_menu.GetSafeHmenu(), ID_PLUGIN_MANAGE, FALSE, GetMenuIcon(IDI_PLUGINS));
CMenuIcon::AddIconToMenuItem(m_main_menu.GetSafeHmenu(), ID_OPTIONS, FALSE, GetMenuIcon(IDI_SETTINGS));
CMenuIcon::AddIconToMenuItem(m_main_menu.GetSafeHmenu(), ID_HELP, FALSE, GetMenuIcon(IDI_HELP));
CMenuIcon::AddIconToMenuItem(m_main_menu.GetSafeHmenu(), ID_APP_ABOUT, FALSE, GetMenuIcon(IDR_MAINFRAME));
@@ -748,6 +749,9 @@ void CTrafficMonitorApp::InitMenuResourse()
CMenuIcon::AddIconToMenuItem(m_taskbar_menu.GetSafeHmenu(), ID_APP_ABOUT, FALSE, GetMenuIcon(IDR_MAINFRAME));
CMenuIcon::AddIconToMenuItem(m_taskbar_menu.GetSafeHmenu(), ID_APP_EXIT, FALSE, GetMenuIcon(IDI_EXIT));
+#ifdef _DEBUG
+ m_main_menu.GetSubMenu(0)->AppendMenu(MF_BYCOMMAND, ID_CMD_TEST, _T("Test Command"));
+#endif
}
HICON CTrafficMonitorApp::GetMenuIcon(UINT id)
diff --git a/TrafficMonitor/TrafficMonitor.rc b/TrafficMonitor/TrafficMonitor.rc
index d54796cb04a43eeb134de34da3975a164acdd5e9..30f798c8d274214be4d01d5d95ead2e824b3b0ba 100644
GIT binary patch
delta 1357
zcmbW1e{54#6vywm_qCR_-Cnmn#8KwzmPtt0U$0wNAhJee3Z*_BnyCZV=xB`4Y%&dQ
z(=fAOBu!+y;t9kE3ym=fq2>vfKXlAt+#kd^79eWMkNAgi3qj-$BL1P?R+$=QiTrVM
za+7;<&iUN$_q;Wu{<_1Jv$?riX0sb4P97tz*n^?_Lae-{D|=5We#35J#xk}^2svi^fT8Jqy5(2rKFx1*fR#&oqy|!JWbY<
z7)i*}%6n2;nNGYUM4Cxh#wHTML4|s-W)^-njlHXDd5dnlRXTb)m~IKl>>wYmUcs*%
z8p2CJ%WXG1;6`nR1!VIdor4P8WTk5@L0Ka_cQ3^QZZ_a*E8vpQ;^YC+CQqE7-oMcq
zA^{SSO$B9)^3!oY=4`MKUmXLR{b6E|4aKZB{OT#D;m7AdEmW{#Mxmwr(#f3oVF7)R
znwb-`E(l|+o;Kj7G<)BSPwyzD}o_cHfCzlsmuXsq~;
zpF*(0V$4~=R{&sOKFgjI9Sh)HhN?m1M=wDBS#;OQ`MX;{fjIu;hr4imBRG`TyRIit
z4ZtG&{1sZo)rG3%*bC5k4W^?tc(+5A7UkBAXZzqhgt)VB
z6<+IyLo7t1LQ1gpj-vdA@Au=?QL2dQA(+-~TXaz=9k2Xj9e*
zxI*~8rxQDwv>x}IT_^6_%4#A-u6G-Mt);n&>u**hUEKA{5}vzZonMzClVuxr;p`Xe
n-&8GY7bg@EeMvAS7A+#&$Ca9b+t67A}
zI{6phqOzG4!y6YT{MTI7zVur8{Lh|X4BJ@D{;Jiq7nIonXtnlm}b
zRS!8jAh1qLZkq1^4zZXB(5HCOTh*
z+h}t)%aYoFXN6uKx>iB3lYekl4qEKu*hz@lz*_5K4g1^D>2F`3+Vph8?9fVs6LK$^0%Fn3p5M0^Y;
z6X2o63vByvl8y7ruR2A0HAZ~pm?GAOb;tkbP#$658oj$lTKt7?h58&LO#kK=pI+i_
zFv^l5xg?od^RS*r4%LbiQ&
+
@@ -530,6 +531,7 @@
+
@@ -598,6 +600,7 @@
+
diff --git a/TrafficMonitor/TrafficMonitor.vcxproj.filters b/TrafficMonitor/TrafficMonitor.vcxproj.filters
index fc4da20bd..6a36f0e43 100644
--- a/TrafficMonitor/TrafficMonitor.vcxproj.filters
+++ b/TrafficMonitor/TrafficMonitor.vcxproj.filters
@@ -178,6 +178,9 @@
{f7dd3288-085a-4de2-9f83-d8ba2f3eff47}
+
+ {dbacfb68-1e03-4bcb-a08b-e87ba558985f}
+
@@ -380,6 +383,9 @@
源文件和头文件\公共的类\PluginManager
+
+ 源文件和头文件\对话框类\PluginManagerDlg
+
@@ -559,6 +565,9 @@
源文件和头文件\公共的类\PluginManager
+
+ 源文件和头文件\对话框类\PluginManagerDlg
+
@@ -666,5 +675,8 @@
资源文件
+
+ 资源文件
+
\ No newline at end of file
diff --git a/TrafficMonitor/TrafficMonitorDlg.cpp b/TrafficMonitor/TrafficMonitorDlg.cpp
index 44206460d..1391c6e21 100644
--- a/TrafficMonitor/TrafficMonitorDlg.cpp
+++ b/TrafficMonitor/TrafficMonitorDlg.cpp
@@ -6,6 +6,8 @@
#include "TrafficMonitor.h"
#include "TrafficMonitorDlg.h"
#include "afxdialogex.h"
+#include "Test.h"
+#include "PluginManagerDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
@@ -108,6 +110,7 @@ BEGIN_MESSAGE_MAP(CTrafficMonitorDlg, CDialog)
ON_MESSAGE(WM_MONITOR_INFO_UPDATED, &CTrafficMonitorDlg::OnMonitorInfoUpdated)
ON_MESSAGE(WM_DISPLAYCHANGE, &CTrafficMonitorDlg::OnDisplaychange)
ON_WM_EXITSIZEMOVE()
+ ON_COMMAND(ID_PLUGIN_MANAGE, &CTrafficMonitorDlg::OnPluginManage)
END_MESSAGE_MAP()
@@ -1826,6 +1829,12 @@ BOOL CTrafficMonitorDlg::OnCommand(WPARAM wParam, LPARAM lParam)
theApp.SaveConfig();
m_connection_change_flag = true;
}
+#ifdef DEBUG
+ if (uMsg == ID_CMD_TEST)
+ {
+ CTest::TestCommand();
+ }
+#endif // DEBUG
return CDialog::OnCommand(wParam, lParam);
}
@@ -2581,3 +2590,11 @@ void CTrafficMonitorDlg::OnExitSizeMove()
CDialog::OnExitSizeMove();
}
+
+
+void CTrafficMonitorDlg::OnPluginManage()
+{
+ // TODO: 在此添加命令处理程序代码
+ CPluginManagerDlg dlg;
+ dlg.DoModal();
+}
diff --git a/TrafficMonitor/TrafficMonitorDlg.h b/TrafficMonitor/TrafficMonitorDlg.h
index 0bd582fbe..878264c14 100644
--- a/TrafficMonitor/TrafficMonitorDlg.h
+++ b/TrafficMonitor/TrafficMonitorDlg.h
@@ -254,4 +254,5 @@ class CTrafficMonitorDlg : public CDialog
afx_msg LRESULT OnDisplaychange(WPARAM wParam, LPARAM lParam);
public:
afx_msg void OnExitSizeMove();
+ afx_msg void OnPluginManage();
};
diff --git a/TrafficMonitor/res/menu_icon/plugins.ico b/TrafficMonitor/res/menu_icon/plugins.ico
new file mode 100644
index 0000000000000000000000000000000000000000..2be3cc1e4c20fc95a3040740b3ef32ae043ee37f
GIT binary patch
literal 9622
zcmeHLJx^3Y6deLcP!cF0*$Qb)P#Y4Zx3a|sXsry5oBaWrYyyRqTPl^Ul>sXwg;?3a
zAAp1e35LRuP#Bf4p2N<;yR-8iy9-Yid@niNJLi7P%$<2Nk9Drg^|+xShiA;q^*Hws
z+VF6#{o$H(@4yubwf2jC=bqev=UA=%7IELoZ-<#c^S@`)9PC)m1cnrV9#I&`U24FL7klSVa#lp9~}AD
zz_h_r=s$p49@NQMpI2yaM)I-GY0INM0#t#!z#XrT1U}5YXF2NRfKJZ$72_)coTG3L
z`XO)|829>pNZBb_&z;D8=fShyte3!C%fNsKb#k&(G6ru&{R57Bg6qh-3mnscJgEcZ
zWT#|IuY4rQc^lVKNXjQWWm3MR`MyVt=1V;`-vy0J5`J6{*4EZKwjSiHPttnq!LO6|
z-+7O31M_X>Jm8+6HegKbJeUE`oE)dXHR8H+FA>zq$xg|b8Lexl%W8EW_tCyvbrZ)}
z>zi{2aNksC=(_+p>qDKf%rPflNpRfLO91xzUAYY%d
z)=Cn5*7Zp{pZQ*%^?c6seqo(3#svY_+FTcaafCs?;@*Re$=Fb@_fOl^cSOIGFK@qTy8+i$
zoXtVq=Z^Ioa-VE$yKy#$?_cxgPy7uJ`WXZ`mXkA=PH49k7k1!tN57Tj8}o^A@|Vog
zC(GO#zhtbh7$<+pEPb-ft?^67`igP#mu%8U`?%qMLFPe@)AoN$aT=Q>^7HHo-}P8K
ztM{Mh*hfHh2>T{a`>4iD$+qWPinBR#{o*U&*D=5UN~Qe%OW2OsBgbcgHODw>r=F!x
zmbsgm#}(>d=XXo@80OzrT%@-7{TCJ`Z)aKo{9aJ^Y;~6hiS6x5W%uCCdI<9Jv4P@R
Gjr#+0{y>xf
literal 0
HcmV?d00001
diff --git a/TrafficMonitor/resource.h b/TrafficMonitor/resource.h
index 0c2c49177..347120cd6 100644
--- a/TrafficMonitor/resource.h
+++ b/TrafficMonitor/resource.h
@@ -232,8 +232,10 @@
#define IDD_SELECT_ORDER_DIALOG 330
#define IDS_COLOR 331
#define IDS_COLOR_LABEL 332
+#define IDD_PLUGIN_MANAGER_DIALOG 332
#define IDS_COLOR_VALUE 333
#define IDS_GPU_USAGE 334
+#define IDI_PLUGINS 334
#define IDS_IF_OPER_STATUS_UP 335
#define IDS_IF_OPER_STATUS_DOWN 336
#define IDS_IF_OPER_STATUS_DORMANT 337
@@ -247,6 +249,8 @@
#define IDS_HARDWARE_MONITOR_WARNING 345
#define IDS_HARDWARE_MONITOR_WARNING2 346
#define IDS_HDD_USAGE 347
+#define IDS_FILE_NAME 348
+#define IDS_STATUS 349
#define IDC_STATIC_INFO 1001
#define IDC_STATIC1 1002
#define IDC_STATIC_DOWN 1002
@@ -434,6 +438,8 @@
#define IDC_MOVE_UP_BUTTON 1136
#define IDC_MOVE_DOWN_BUTTON 1137
#define IDC_SET_ORDER_BUTTON 1137
+#define IDC_OPTINS_BUTTON 1139
+#define IDC_PLUGIN_MANAGE_BUTTON 1140
#define ID_32771 32771
#define ID_NETWORK_INFO 32772
#define ID_32773 32773
@@ -530,7 +536,7 @@
#define ID_FIRST_DAY_OF_WEEK_MONDAY 32866
#define ID_CALENDAR_JUMP_TO_TODAY 32867
#define ID_FREQUENTY_ASKED_QUESTIONS 32868
-#define ID_32869 32869
+#define ID_CMD_TEST 32869
#define ID_SHOW_UP_SPEED 32870
#define ID_SHOW_DOWN_SPEED 32871
#define ID_SHOW_CPU_USAGE 32872
@@ -543,16 +549,18 @@
#define ID_SHOW_HDD 32879
#define ID_UPDATE_LOG 32880
#define ID_HELP_32881 32881
+#define ID_32882 32882
+#define ID_PLUGIN_MANAGE 32883
#define ID_SELETE_CONNECTION 33000
#define ID_SELECT_ALL_CONNECTION 33001
// Next default values for new objects
-//
+//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 332
-#define _APS_NEXT_COMMAND_VALUE 32882
-#define _APS_NEXT_CONTROL_VALUE 1139
+#define _APS_NEXT_RESOURCE_VALUE 335
+#define _APS_NEXT_COMMAND_VALUE 32884
+#define _APS_NEXT_CONTROL_VALUE 1141
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif