看流星社区

 找回密码
 注册账号
查看: 2147|回复: 0

如何用VC编写DLL动态链接库文件

[复制链接]

该用户从未签到

发表于 2013-5-28 09:05:08 | 显示全部楼层 |阅读模式
引言

前不久刚学会了如何用VB编写DLL动态链接库,但是用vb编写动态链接库比较麻烦些。下面我们再学习一下如何用vc编写dll动态链接库,并且通过vc或者vb调用

正文

这里主要介绍两个东东
第一:用vc编写动态链接库,用vc调用
第二:用vb编写动态链接库,用vb调用

一、用vc编写动态链接库,用vc调用

1、创建DLL文件,命名为FIRSTDLL

1)打开visual c++ 6.0通过new创建一个win30 Dynamic-link Libary的工程,命名为FIRSTDLL
2)接着选择最后一个选项,让系统帮我们创建一些必要的文件
3)把FIRSTDLL.cpp用下面的代码覆盖

// FIRSTDLL.cpp : Defines the entry point for the DLL application.
            //
            #include "stdafx.h"     //这个文件定义了源程序为C++格式。 否则文件需要保存为.C格式
            #include "FIRSTDLL.h"
            int Max(int a, int b)  //定义一个函数MAX,实现求两个数的最大数
            {
            if(a>=b)return a;
            else
            return b;
            }
            

4)接着我们在FIRSTDLL.h头文件里头用下面的代码覆盖
extern "C" _declspec(dllexport) int Max(int a, int b);
            //一是在定义函数时使用导出关键字_declspec(dllexport),另外,可以通过创建.def文件来导入函数,具体见最后的参考资料
            


5)好拉,我们现在可以编译FIRSTDLL.cpp文件拉,到debug目录下看看,是不是已经生成拉我们需要的FIRSTDLL.dll拉

2、通过vb编写一个函数来调用该DLL,该函数为USEFIRSTDLL

1)同样通过new创建一个工程,该工程为win30 application,命名USEFIRSTDLL
2)在USEFIRSTDLL.cpp文件中用如下代码覆盖

//我们采用的是显式链接哦,下面的参考资料介绍了另一种使用DLL的方式:隐式链接
            #include "stdio.h"
            #include "stdafx.h"  //这个文件定义了源程序为C++格式。 否则文件需要保存为.C格式
            void main(void)
            {
            typedef int(*pMax)(int a,int b);  //定义指向和DLL中相同的函数原型指针
            HINSTANCE HDLL;                            //定义句柄
            pMax Max;
            HDLL=LoadLibrary("C:\\Program Files\\Microsoft Visual Studio\\MyProjects\\FIRSTDLL\\Debug\\FIRSTDLL.dll");       //加载动态链接库FIRSTDll.dll文件,注意指明FIRSTDLL的地址哦
            if(HDLL==NULL) printf("cannot find the dll file");
            Max=(pMax)GetProcAddress(HDLL,"Max");       //然后通过GetProcAddress()函数获取导入到应用程序中的函数指针
            if(Max==NULL) printf("cannot find the Max funtion");
            int A=Max(5,8);
            printf("比较的结果为: %d ",A);
            FreeLibrary(HDLL);//卸载MyDll.dll文件;
            }
            

好拉,到这里第一部分介绍完拉
下面介绍第二部分


二、用vc编写动态链接库,用vb调用

在介绍这个之前必须声明的是(引用自下面的参考资料)


一个DLL中的函数要想被VB调用,必须满足两个条件:一是调用方式为stdcall,另一个是必须是export的。要做到第一条,只须在函数声明前加上__stdcall关键字。如:
  short __stdcall sample(short nLen, short *buffer)
  要做到第二条,需要在*.def文件中加上如下的几行:
  EXPORTS
  sample @1
  这里的sample是你要在VB中调用的函数名,@1表示该函数在DLL中的编号,每个函数都不一样。注意这里的函数名是区分大小写的。





1、下面我们类似一创建名为SecondDll的DLL文件

1)创建SecondDll,代码如下:
#include "stdafx.h"  //注意拉,我们这里不再需要SecondDll.h头文件,现在我们采用的是
            int __stdcall Max(int a, int b)
            {
            if(a>=b)return a;
            else
            return b;
            }
            

2)往我们的工程里头添加一个SecondDll.def文件,内容如下
LIBRARY SecondDll
            EXPORTS
            Max @1
            

解释一下哦:
@1是表示Max函数在DLL中函数组中是第一个函数,具体见参考资料

ok,保存
编译、创建我们的SecondDll.dll

2、通过Vb调用SecondDll.dll文件,来求两个数中的最大者

我们直接 编写一段代码如下哦

Private Declare Function Max Lib "C:\Program Files\Microsoft Visual Studio\MyProjects\SecondDll\Debug\SecondDll.dll" (ByVal a As Long, ByVal b As Long) As Long
            Private Sub Form_Load()
            Me.Caption = "最大值是:" & Max(5, 9)
            End Sub
            

看到效果没有啊,在我们的窗体标题中显示拉:"最大值是9"

到这里我们的工作接结束拉,不过要熟练掌握还得多编写程序拉,下面是我在学习时的参考资料,非常详细哦。
在这里,我真的是要谢谢那些专家们为我们免费提供了这么多参考资料,大家要好好珍惜才是,呵呵。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-15 18:45

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表