以下是一段利用 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;
}
MFC 加载 DLL 实现三相源控制及日志输出

原文地址: https://www.cveoy.top/t/topic/nVwd 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录