栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ MFC调用易语言模块

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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,然后是比较麻烦的字符类型对应LPCSTR类型,因为这个字符串类型鄙人忙活了一天,实在是比较坑。

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

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

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

参考资料:

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

C++调用易语言DLL

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1000819.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号