探索黑客技术攻防,实战研究与安全创新

导航菜单

VC++&易语言

最近在学习易语言,由于危险漫步的主打语言是v c++,所以第一看易语言的时候感觉怪怪的,看了一段时间之后发现这个语言的编程模式确实简单,没有那么多繁琐的语法限定与规则,确实适合没有学过编程语言的人学习使用,而且他的应用软件编程能力不亚于v c++,或者说在开发速度上高于v c++。尤其是在界面的组件功能上,实在是太强大了,现在我有一种冲动,打算用v c++与易语言联合使用来开发我的程序,当然这虽然不太符合公司的规定。本文就介绍一下这两种编程语言通过生成dll动态链接库来实现相互调用,实现功能的扩展与互补。

8]Q6Y4I@{78H`XMSTXCMO`9.jpg

首先来看一下在易语言中怎么生成dll与dll的调用方法。打开易语言开发平台后,我们首先将默认的对话框模式的程序关闭,然后点击“程序”“新建”,弹出向导对话框,我们选择“windows动态链接库”模式,完成后就会产生向导代码。我们来讲解一下当前的代码作用。在向导生成的代码中,包含了两个子程序,一个是“启动子程序”,另一个是“临时子程序”。对于“启动子程序”我们可以把它跟c++中dll的dllmain来类比看侍,它的作用就是在dll加载的时候启动。对于“临时子程序”,后面已经给了我们很详细的注视了:本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。注意不要修改本子程序的名称、参数及返回值类型。

其实这个程序的作用就是方便我们在dll开发过程中实现对dll测试用的。在vc++中dll的开发调试需要用到两一个应用程序同步测试,但在易语言中我们不需要另外写一个程序来进行测试,直接在这个子程序中就可以测试我们的功能。

下面就可以写我们的dll功能代码了。快捷键ct rl+n来创建一个子程序(“子程序”这个名称不太习惯,我还是用“函数”吧),我们给新增的函数命名为“edll”,返回值为整形,参数为两个整数,“公开”这个徐昂想一定要选上,否则我们的dll函数将无法导出。我们来实现一个简单的加法功能,(由于受c++的影响,变量还是习惯于英文)。由子易语言属于智能编译,我们在每一行代码编写完毕回车到下一行的时候我们的代码都会编译一次,所以我们可以在第一时间内发现代码错误。功能代码写完之后我们在临时子程序中测试一下我们的代码,这里我们添加了一个临时变量res来存:返回值。测试函数运行之后将调用我们的函数,将结果用提示框提示我们,这个与我们V c++-中13<JM~ssageBox()的功能是一样的。为了在没有安装易语言开发平台的机器上也能使用我们的程序,我们在编译的时候需要使用静态编译,或者导出支持库。

dll写完了,下面我们看一下在易语言中我们应该怎么调用dll中的函数。我们新建一个窗口程序,添加一个按钮,双击按钮为单击事件添加代码。我们在开发平台左栏找到”DLL命令”,点击右键,选择“插入新的dll命令”,此时将出现一个空白的文档,我们在空白的文档上单击右键选择“新dll命令”,平台会自动的为我们添加相应的代码。“dll命令名”值得是我们在当前程序中使用的DLL中的函数的名字,算是一个别名,当然这个明命令的属性应该与目标函数的属性一致,有返回值。“dll库文件名”就是我们要调用的dll的文件:“在dll中对应的命令名”就是我们dll中的原始函数名,注意这里是有参数的,参数名不需要与dll中的完全相同。在dll命令添加完毕后这个“dll命令名”我们就可以直接使用了。我们传递两个参数,使用信息框来显示函数的返回值。

易语言调用易语言dll的代码我们实现了。下面看一下易语言调用v c++写的dll是怎么进行的。由于易语言只支持stdcall模式的函数调用,所说义我们需要确保目标dll的函数导出模式是stdcall。由于c++编

写的dll大都使用c标准调用,所以在易语言中使用别人发布的dll时常会遇到堆栈不平衡的现象。所以在我们自己用vs进行dll开发的时候需要将调用规范调整为stdcall模式。由于使用了stdcall模式,所以在dll的导出函数中函数名汇编编译器修改,会发生变化,在vs中我们的一个函数myadd代码如下:

但是编译完毕之后这个函数名就变成了:?myadd@@YGHHH@Z。这一点在我们引用dll的时候一定要注意。我们在易语言中新增一个dll命令。我们在窗体上新增一个按钮,双击按钮写入单击事件代码。

下面我们使用c++应用程序来调用一下我们使用易语言写的dll,由于我们的dll是stdcall调用约定,所以我们必须修改我们应用程序的调用约定,代码如下:

到这里我们易语言与v c++模块的混合调用就讲解完毕了,由于易语言支支持stdcall模式的调用,所以在进行混合编程调用时一定要注意调用约定的统一,否则会造成堆栈的不平衡。