打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
易语言读取VC回调接口数据

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

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

废话少说,进入主题。

---------------------------------------------------------------------------------------------

1. VC编写DLL

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

  1. // 回调函数原型  
  2. // 接口调用方式:WINAPI  
  3. // 接口参数:int iData  
  4. // 返回值:无  
  5. typedef VOID (WINAPI *PFN_CALLBACK)(int iData);  


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

  1. // 用来保存EXE中的函数地址  
  2. PFN_CALLBACK g_pfnUser = NULL;  
  3.   
  4. // 给EXE调用的接口,让EXE把自身的某个子程序地址传给DLL  
  5. BOOL WINAPI SetCallback(PFN_CALLBACK pfn)  
  6. {  
  7.     if (pfn == NULL)  
  8.     {  
  9.         return FALSE;  
  10.     }  
  11.     g_pfnUser = pfn;  
  12.     return TRUE;  
  13. }  


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

  1. // 调用EXE回调函数  
  2. VOID WINAPI StartCallback(VOID)  
  3. {  
  4.     if (g_pfnUser != NULL)  
  5.     {  
  6.         Data data;  
  7.         char szData[] = "abc123哈哈xx";  
  8.         data.pData = szData;  
  9.         data.iLen = strlen(szData);  
  10.         g_pfnUser((int)&data);  
  11.     }  
  12. }  


好了,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中声明一个子程序:

  1. .版本 2  
  2. .支持库 spec  
  3.   
  4. .子程序 DLL回调_子程序  
  5. .参数 iData, 整数型  
  6. .局部变量 数据, Data  
  7.   
  8.   
  9. 调试输出 (“进入 -----------------------> DLL回调_子程序”)  
  10. 调试输出 (“iData=” + 到文本 (iData))  
  11.   
  12. RtlMoveMemory (取变量地址 (数据), 取变量地址 (iData), 8)  
  13.   
  14. 调试输出 (“数据长度:” + 到文本 (数据.iDataLen))  
  15. 调试输出 (“数据内容:” + 指针到文本 (数据.pszData))  


 

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

.版本 2

.数据类型 Data
    .成员 pszData, 整数型
    .成员 iDataLen, 整数型

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

SetCallback (&DLL回调_子程序)

 

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

StartCallback ()

程序界面如下:

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

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

 

 

 

 

 

 

 

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
拦截窗口消息的示例
勾子基本概念
e(易精经第二章)
8051直流电机的开环控制程序(1)
Matthew Curland的VB函数指针调用
PE格式解析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服