永发信息网

VC调用易语言写的DLL例子

答案:1  悬赏:0  手机版
解决时间 2021-11-09 01:34
  • 提问者网友:爱了却不能说
  • 2021-11-08 04:27
VC调用易语言写的DLL例子
最佳答案
  • 五星知识达人网友:怙棘
  • 2021-11-08 04:37
今天尝试用VC++调用易语言的DLL。易语言有很多不错的高级函数库,且编写DLL过程非常简单,一切C++下复杂的功能,可以在易语言里简单的实现,所以我们考虑通过易语言制作DLL给VC++调用。

易语言的DLL函数都是stdcall约定,而且不会生成lib文件给你调用。

这样,要调用我们易dll有两种途径:

1. VC中动态调用_stdcall。

2. 自己制作一份lib文件再静态调用。

这两种方法各有利弊,如果DLL里的函数较多,制作lib库会花些时间,但是一劳永逸。

动态调用DLL则需要调用API函数LoadLibrary 和 GetProcAddress。LoadLibrary载入需要调用的DLL文件,然后用GetProcAddress 得到DLL中某个函数的指针,然后通过函数指针调用。

下面我们举例说明,如何制作易语言DLL并在VC中动态调用。

1. 首先,制作一个易语言的DLL。

打开易语言,弹出向导中选择"windows动态链接库"。

现在我们添加自己的函数了。Ctrl+N添加一个函数如下

.版本 2

.子程序 myadd, 双精度小数型, 公开
.参数 a, 双精度小数型
.参数 b, 双精度小数型

返回 (a + b)

myadd函数用来计算两个双精度小数(即C++的double类型)的和。

不要忘记函数要公开,这样才能export此函数。

完成后,编译成dll文件,命名为mydll.dll

这样,一个简单的易语言DLL就制作完成了。

2. 在VC中调用易语言的DLL

要动态调用DLL,需要使用API函数LoadLibrary 和 GetProcAddress。查下MSDN就知道,使用这两个函数需要加入

#include

接下来,我们需要对调用的函数声明一个_stdcall的函数类型。

typedef double(CALLBACK *dll_myadd)(double,double);

(注意: CALLBACK和WINAPI都是__stdcall的一种别名,这个在windef.h中有定义:

#define CALLBACK __stdcall //回调函数用
#define WINAPI __stdcall //WINAPI用
用哪个随便,你也可以直接写__stdcall. )

有了函数类型,你就可以用他来定义函数指针变量,进而调用函数了。

HINSTANCE hDll; //dll句柄
dll_myadd myadd; //函数指针变量

hDll=LoadLibrary("mydll.dll"); //载入dll
myadd=(dll_myadd)GetProcAddress(hDll,"myadd"); //得到dll中myadd函数的指针地址

double s = myadd(1.2,2.3); //这里调用函数

不要忘记,在DLL使用完毕后要调用

FreeLibrary(hDll); //释放DLL句柄

这样调用易语言DLL的简单例子就完成了。需要注意的是:

声明函数类型的时候,一定要指定是stdcall调用,这点不能省略。因为VC默认的调用方式是cdecl方式。

如果想省略的话也可以,那就是要改变项目属性,在属性页 - C++选项卡 - 高级 - 调用约定 里 选择使用stdcall。这样也可以省略stdcall声明。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯