易语言无法调用c语言的dll文件路径,[原创]VC++调用易编DLL的方法(静态库导入)|易语言俱乐部...

这里说的不是用LoadLibrary动态载入,虽然VC++用动态调用其实很容易,但很多VC++程序员很不习惯这种做法,因为要自己管理DLL的载入和释放,有的甚至不懂怎么动态调用DLL,已经依赖有H文件声明和导入静态库(LIB)方式。

所以一直以来困扰很多人,总是听到有人问,VC++怎么调用易的DLL?!

今天,我就来介绍这种在VC++常规的方法来调用易DLL。首先,我们需要一个小工具,这个工具是本人编写的,就是专门生成VC++需要的DLL导入函数库,当然不是把易的DLL转成静态库,静态库也分几种,一种就是我们需要的,包含有DLL函数信息的库,C++调用DLL需要这个。我这个工具就是生成这种库的。

111901286_1_20170926051741177.gifmY6DezBh.rar (219 K) 下载次数:565

下载工具以后,分两步骤,第一步从DLL中导出函数的名称说明文件*.Def,以“VCode.dll”为例,它生成的VCode.def文件是这样的:

LIBRARY Vcode.dll

EXPORTS

DeError   @1

DeInfo   @2

GetByteVcode  @3

GetFileVcode  @4

GetRecNum  @5

GetUrlVcode  @6

GetWebVcode  @7

LoadDe   @8

LIBRARY 易编的DLL名称,这个名称不能乱改的,要对应实际文件名,相当于LoadLibrary()的参数,改了程序就启动不了,而且提示框也是系统的,这和动调用DLL不同。

EXPORTS后面跟着的就是DLL的所有导出函数名称,名称后面的由空格隔开的@XX数字是函数的序号,这也是不能改动的。

那么能改的是什么?只有函数名了。为什么要改函数名?

因为VC++对于C语言风格(extern "C")的导入函数都是要上 _函数名@N 这种式样的修饰符,不然编译不了。易编写的DLL函数是不能编写这种名称的,所以在这里要自己动手修改,@N 的N是用数字表示(注意,和上面的@意义不同)这里@数字是表示函数的参数总字节数之和,即调用栈大小。就是由参数个数和类型决实的,通常是 参数个数 × 4 ,如果参数有日期型或长整数型或双精度小数型(非传址,即参考指针型),每有一个参数这些类型的就要再加4,因为这些类型是8字节的,相当于其它类型的两个参数,实际编译也是分两段两次入参数栈道的。

如果不会计算,那就更简单了,直接开始第二步骤,先别修改了,把刚才的*.Def编译成LIB静态库。

最后就是写C++需要的*.h文件了,上面有关于易DLL导出函数的声明,接着上例:

//导入函数表静态库文件(刚才我们编译出来的Vcode.LIB)

#pragma comment(lib, "Vcode.lib")

extern "C" //其它语言编译的DLL要用C风格{

//DLL函数 int _stdcall LoadDe(char* strFilePath,char* strFilePath2);

....

}

然后编译VC++工程,是调用易DLL的,肯定会出错,你看看找不到函数了吧:

Linking...

VcodeDemoDlg.obj : error LNK2001: unresolved external symbol _DeInfo@4

VcodeDemoDlg.obj : error LNK2001: unresolved external symbol _DeError@4

VcodeDemoDlg.obj : error LNK2001: unresolved external symbol _LoadDe@8

VcodeDemoDlg.obj : error LNK2001: unresolved external symbol _GetUrlVcode@12

VcodeDemoDlg.obj : error LNK2001: unresolved external symbol _GetWebVcode@16

VcodeDemoDlg.obj : error LNK2001: unresolved external symbol _GetFileVcode@12

VcodeDemoDlg.obj : error LNK2001: unresolved external symbol _GetByteVcode@16

不过它也把要求的函数名列出来了,不用自己计算了,把这些@数字加到相应的函数后面,修改DEF文件,如下:

LIBRARY Vcode.dll

EXPORTSDeError@4                   @1

DeInfo@4                    @2

GetByteVcode@16        @3

GetFileVcode@12          @4

GetRecNum@16            @5

GetUrlVcode@12           @6

GetWebVcode@16         @7

LoadDe@8                    @8

这里有两个@也是跟数字,注意不要改错了,是改紧跟着函数名的。改好后重新编译LIB,再次构建VC++工程,这次全部通过了。

你把H文件,LIB文件和DLL文件三个文件拿给喜欢偷懒的VC++程序员,这次易和C++的合作就算圆满完成了。[em01]

[此贴子已经被作者于2009-3-16 2:49:48编辑过]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值