首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[易语言]易语言调用C++ DLL回调函数

[易语言]易语言调用C++ DLL回调函数

作者头像
云未归来
发布2025-07-17 13:52:56
发布2025-07-17 13:52:56
16700
代码可运行
举报
运行总次数:0
代码可运行

易语言适合用于数据展示,数据的获取还是VC来的快、方便哈。

因此我一般使用VC编写DLL,使用易语言编写界面,同一个程序,DLL和EXE通讯最方便的就是使用接口回调了。

废话少说,进入主题。

1. VC编写DLL

为了DLL能够调用EXE中的函数,我们先声明回调函数原型:

代码语言:javascript
代码运行次数:0
运行
复制
// 回调函数原型
// 接口调用方式:WINAPI
// 接口参数:int iData
// 返回值:无
typedef VOID (WINAPI *PFN_CALLBACK)(int iData);

声明好了回调函数原型,我们需要知道EXE中函数的地址,因此需要在DLL中提供个接口给EXE调用,让EXE把函数地址传给DLL:

代码语言:javascript
代码运行次数:0
运行
复制
// 用来保存EXE中的函数地址
PFN_CALLBACK g_pfnUser = NULL;

// 给EXE调用的接口,让EXE把自身的某个子程序地址传给DLL
BOOL WINAPI SetCallback(PFN_CALLBACK pfn)
{
    if (pfn == NULL)
    {
        return FALSE;
    }
    g_pfnUser = pfn;
    return TRUE;
}

为了方便测试,我在DLL中提供了一个手动调用EXE函数的接口:

代码语言:javascript
代码运行次数:0
运行
复制
// 调用EXE回调函数
VOID WINAPI StartCallback(VOID)
{
    if (g_pfnUser != NULL)
    {
        Data data;
        char szData[] = "abc123哈哈xx";
        data.pData = szData;
        data.iLen = strlen(szData);
        g_pfnUser((int)&data);
    }
}

好了,DLL部分编写完成。

2. 易语言EXE程序编写

(1) 在DLL命令中声明我们在DLL中编写的接口

.版本 2

.DLL命令 SetCallback, 逻辑型, "dlltest.dll", "SetCallback"     .参数 pfn, 子程序指针

.DLL命令 StartCallback, , "dlltest.dll", "StartCallback"

为了方便数据拷贝,我们还需要导入kernel32.dll的一个API接口: RtlMoveMemory

.版本 2

.DLL命令 RtlMoveMemory, , "kernel32", "RtlMoveMemory"

    .参数 目标数据地址, 整数型

    .参数 源数据, 整数型

    .参数 尺寸, 整数型

到这里,准备工作已经做好了,在EXE中声明一个子程序:

代码语言:javascript
代码运行次数:0
运行
复制
.版本 2
.支持库 spec

.子程序 DLL回调_子程序
.参数 iData, 整数型
.局部变量 数据, Data


调试输出 (“进入 -----------------------> DLL回调_子程序”)
调试输出 (“iData=” + 到文本 (iData))

RtlMoveMemory (取变量地址 (数据), 取变量地址 (iData), 8)

调试输出 (“数据长度:” + 到文本 (数据.iDataLen))
调试输出 (“数据内容:” + 指针到文本 (数据.pszData))

当然为了和DLL中的数据类型保持一致,我们得在EXE中自定义一个数据类型:

.版本 2

.数据类型 Data

    .成员 pszData, 整数型

    .成员 iDataLen, 整数型

在EXE程序启动时,我们设置回调,把子程序的地址传给DLL:

SetCallback (&DLL回调_子程序)

给EXE加个按钮,让DLL调用子程序:

StartCallback ()

程序界面如下:

点按钮,启动回调,效果如下:

* “进入 -----------------------> DLL回调_子程序” * “iData=1635536” * “数据长度:12” * “数据内容:abc123哈哈xx”

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档