C++ MFC调用易语言模块

    易语言有很多现成的模块,我们都知道学编程祖师爷有个祖训:不要重复发明轮子。虽然我们当然应该不断学习扩展知识的边界,但也不能啥都自己亲力亲为,不能为了做个西红柿炒鸡蛋就自己从晒盐开始做起。

    易语言其实没有自己的链接器,也就是把代码编译成二进制的可执行文件。易语言用的是VB或者VC++的链接器,所以可以在易语言里把模块内的函数也就是易语言称之为“子程序”的编译成DLL来给其他语言调用。

    首先先给易语言装一个“黑月编译器”,如图:

去随便搜一个来装起来就行,最好用手工安装包,自动安装包有时候会装不上,不知道咋回事。

把手工安装包里的4个文件夹的文件复制到易语言安装目录后选择:

工具→支持库配置

在“查找”框内输入:hy

把黑月编译器前面的勾选上。就可以在“编译”菜单内看到黑月的编译选项了。

还可以在“工具”菜单栏下看到黑月编译器的设置选项。

鄙人是用“黑月应用程序向导”来创建的DLL工程,用易语言自己的DLL工程创建项目鄙人就没试过了。 

点击“黑月应用程序向导”

点击“下一步”

 

然后选择Windows DLL程序,再选择“完成”。

然后把以下几处默认添加的消息框函数删除:

 然后就可以在它这个名为Hello的默认子程序下写自己的代码。

引入模块,这里用常见的超级模块举例。

这里用 取进程ID 来测试,此函数会根据参数也就是进程名返回进程的PID。例如:

 用这个小工具“排版助手”为例,这就是它的进程名。

调用模块内的子程序后返回它的值,这样就可以在C++中接收这个值,这样就能调用易语言模块内的函数了,现在静态编译这个DLL。

记住要选择黑月编译器的静态编译功能,编译后DLL名为:virus.dll。

然后就能得到一个DLL,下面到MFC中去调用这个DLL。

新建一个MFC对话框工程,把编译出来的DLL放到MFC编译出来的exe程序同一个目录。

LPCSTR maki;
std::string rned;

HINSTANCE hModule = LoadLibrary("virus.dll");//打开DLL

typedef int(_stdcall *lpGetProcId)(LPCSTR a);//定义函数指针

lpGetProcId dec_fp = (lpGetProcId)GetProcAddress(hModule, "Merge"); 
//Merge是DLL中的函数名,已经被导出

int kk=dec_fp("gidot typesetter.exe");//排版助手的进程名

rned ="PID:"+std::to_string(kk)+"\n"; //int转换为string类型

maki=rned.c_str();//string转LPCSTR
	

WriteConsole(hdlWrite, maki, CString(maki).GetLength(), NULL, NULL); 
//向DOS窗口里输出字符串

这里最关键的是调用约定,编译出来的DLL是用 _stdcall 调用规则,不显式的标明会出现调用无参数的函数没问题,一旦需要传参进去,特别是数学类型参数比如Int型 float型参数的时候调用可以成功,但稍后程序就会崩溃,估计崩溃原因是堆栈不平衡,所以一定要显式标明调用约定。

其次则是易语言不支持宽字符,需要把项目的字符改成“多字节集”。

然后易语言的整数型对应C语言的Int类型 长整数型作为返回值对应unsigned long或UINT64类型,做为参数对应UINT64,然后是比较麻烦的字符类型对应LPCSTR类型,经过实测用CString也是可以的。

估计很多看官和鄙人一样既然都学了C++也就不会去用易语言,所以手头上也没有易语言,而且这玩意整天报毒用的人是提心吊胆,这里推荐没有易语言的各位去某宝买一个××版,也就3块钱,然后装个虚拟机,虚拟机装个WIN7就行,这玩意编译出来的DLL拿杀毒软件查还是不报毒的,至于××版易语言本身有没有毒那就天知道了。

这个精益模块打包前最好弄个易语言的对话框程序弄个按钮控件调用一下,精益模块需要注册,它会生成一个注册表项,第一次使用会弹出一个窗口,可以免费使用,但是要获取免费授权,如果不注册直接打包成DLL会如何鄙人不清楚,所以推荐照着测试的看官先弄个易语言窗口程序先调用一次精益模块内的函数,让模块注册,再打包成DLL用C++调用。

最后鄙人会把示例中用到的模块 易语言示例工程和MFC示例工程一同打包上传,供看官参考。

2022.9.8日更新:

实践发现这样调用易语言模块内的功能在多线程状态下运行一段时候后程序会自己崩溃,有的模块会有的模块不会,如果只是单线程调用就没其他问题。

参考资料:

条条大路通罗马-在C/C++里调用易语言的模块

C++调用易语言DLL

本文例子:C++MFC调用易语言模块例子-其他文档类资源-CSDN下载

这两天搬C++代码到 易语言 上,虽然一路顺风,但是感觉有点乱,比如数据结构之类的,有些的结构复杂,要自己计算偏移量 于是,灵感来了,把C++的结构代码复制到易语言里,然后解析一下,如果调用C++返回的是数据 结构的话,把指针取出来,然后利用本模块便可以模拟加载指针到 动态数据 类型。 步骤:(如果是有指针的) 1、置入相关结构大小() (如果有无法识别的 且不为C++中的指针类型将会默认认为是int型,所以先置入,避免结构出错,没有其他结构的就不管) 2、解析类() (把C++中的结构粘过来解析一下,解析完成后将返回xx结构的大小,类似于C++中定义xx类型后,调用sizeof()一样) 3、置xx指针() (把指针置入进去) 4、Get() 就可以愉快的取出值啦,默认可以取出int,string。如果是其他自定义的xx结构,将会返回字节集,如果C++中原本是指针类型的,这里就返回指针 如果是没有指针的,而是我们创建数据 类型传入C++中 1、置入相关结构大小() 同上 2、解析类() 同上 3、创建数据 空间() 就类似于C++中的先new初始化一下空间 4、Set() 设置值啦! 5、取类指针() 取出自定义xx类型结构的指针,然后传入DLL函数中调用C++。 下面是我的实验截图: 1、C++中原本定义的结构: 2、C++调用,然后先取一下结构大小 3、把结构粘贴到易语言中 4、运行一下。 5、至于使用,已经在exosip项目里测试过了,取值没问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值