MFC 加载 DLL 实现三相源控制及日志输出
以下是一段利用 MFC 代码,通过加载 'DLL7000.dll' 实现文本框输入数值,点击开始按钮三相源升源到该数值,点击停止按钮源停止输出,该过程输出的日志会在文本框输出展示的示例:
// 声明需要用到的控件
CEdit m_editValue; // 输入数值的文本框
CButton m_btnStart; // 开始按钮
CButton m_btnStop; // 停止按钮
CEdit m_editLog; // 日志输出的文本框
// 声明要用到的函数指针类型
typedef void (*StartFunc)(double value); // 启动函数指针类型
typedef void (*StopFunc)(); // 停止函数指针类型
typedef void (*LogFunc)(const char* message); // 日志输出函数指针类型
// 声明要用到的变量
HINSTANCE m_hDllInstance = NULL; // DLL实例句柄
StartFunc m_pfnStart = NULL; // 启动函数指针
StopFunc m_pfnStop = NULL; // 停止函数指针
LogFunc m_pfnLog = NULL; // 日志输出函数指针
// 加载DLL并获取函数指针
void LoadDLL()
{
// 加载DLL
m_hDllInstance = LoadLibrary(_T("DLL7000.dll"));
if (m_hDllInstance == NULL)
{
MessageBox(_T("加载DLL失败!"));
return;
}
// 获取函数指针
m_pfnStart = (StartFunc)GetProcAddress(m_hDllInstance, "Start");
m_pfnStop = (StopFunc)GetProcAddress(m_hDllInstance, "Stop");
m_pfnLog = (LogFunc)GetProcAddress(m_hDllInstance, "Log");
if (m_pfnStart == NULL || m_pfnStop == NULL || m_pfnLog == NULL)
{
MessageBox(_T("获取函数指针失败!"));
FreeLibrary(m_hDllInstance);
m_hDllInstance = NULL;
return;
}
// 输出加载成功日志
m_pfnLog("DLL加载成功!");
}
// 卸载DLL
void UnloadDLL()
{
if (m_hDllInstance != NULL)
{
FreeLibrary(m_hDllInstance);
m_hDllInstance = NULL;
m_pfnStart = NULL;
m_pfnStop = NULL;
m_pfnLog = NULL;
m_pfnLog("DLL卸载成功!");
}
}
// 启动源输出
void StartSource()
{
CString strValue;
m_editValue.GetWindowText(strValue);
double value = _tstof(strValue);
if (m_pfnStart != NULL)
{
m_pfnStart(value);
m_pfnLog("源已启动!");
}
}
// 停止源输出
void StopSource()
{
if (m_pfnStop != NULL)
{
m_pfnStop();
m_pfnLog("源已停止!");
}
}
// 日志输出函数
void LogMessage(const char* message)
{
CString strMessage(message);
m_editLog.SetWindowText(strMessage);
}
// 点击开始按钮事件
void OnBtnStartClicked()
{
StartSource();
}
// 点击停止按钮事件
void OnBtnStopClicked()
{
StopSource();
}
// 初始化函数,在OnInitDialog中调用
void Init()
{
// 加载DLL并获取函数指针
LoadDLL();
// 设置日志输出函数
if (m_pfnLog != NULL)
{
m_pfnLog = LogMessage;
}
// 绑定按钮事件
m_btnStart.SetWindowText(_T("开始"));
m_btnStart.EnableWindow(FALSE);
m_btnStart.SetDlgCtrlID(IDC_BTN_START);
m_btnStart.ShowWindow(SW_SHOW);
m_btnStart.SetFont(GetFont());
m_btnStart.EnableWindow(TRUE);
m_btnStart.SetFocus();
m_btnStart.SetWindowText(_T("开始"));
m_btnStart.EnableWindow(FALSE);
m_btnStart.SetDlgCtrlID(IDC_BTN_START);
m_btnStart.ShowWindow(SW_SHOW);
m_btnStart.SetFont(GetFont());
m_btnStart.EnableWindow(TRUE);
m_btnStart.SetFocus();
m_btnStop.SetWindowText(_T("停止"));
m_btnStop.EnableWindow(FALSE);
m_btnStop.SetDlgCtrlID(IDC_BTN_STOP);
m_btnStop.ShowWindow(SW_SHOW);
m_btnStop.SetFont(GetFont());
m_btnStop.EnableWindow(FALSE);
// 设置文本框默认值
m_editValue.SetWindowText(_T("0"));
}
// 关闭窗口事件
void OnClose()
{
UnloadDLL();
}
// MFC窗口消息处理函数
BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BTN_START, OnBtnStartClicked)
ON_BN_CLICKED(IDC_BTN_STOP, OnBtnStopClicked)
END_MESSAGE_MAP()
// MFC窗口初始化函数
BOOL CMyDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
Init();
return TRUE;
}
原文地址: https://www.cveoy.top/t/topic/nVwd 著作权归作者所有。请勿转载和采集!