VC++动态链接库(DLL)编程深入浅出之二(1)——非MFC dll
来源:互联网 发布:51单片机控制12v继电器 编辑:程序博客网 时间:2024/05/16 04:17
上节给大家介绍了静态链接库与库的调试与查看(动态链接库(DLL)编程深入浅出(一)),本节主要介绍非MFC DLL。
4.非MFC DLL
4.1一个简单的DLL
第2节给出了以静态链接库方式提供add函数接口的方法,接下来我们来看看怎样用动态链接库实现一个同样功能的add函数。
如图6,在VC++中new一个Win32 Dynamic-Link Library工程dllTest(单击此处下载本工程附件)。注意不要选择MFC AppWizard(dll),因为用MFC AppWizard(dll)建立的将是第5、6节要讲述的MFC 动态链接库。
图6 建立一个非MFC DLL
在建立的工程中添加lib.h及lib.cpp文件,源代码如下:
/* 文件名:lib.h */
#ifndef LIB_H
#define LIB_H
extern "C" int __declspec(dllexport)add(int x, int y);
#endif
/* 文件名:lib.cpp */
#include "lib.h"
int add(int x, int y)
{
return x + y;
}
#include <stdio.h>
#include <windows.h>
typedef int(*lpAddFun)(int, int); //宏定义函数指针类型
int main(int argc, char *argv[])
{
HINSTANCE hDll; //DLL句柄
lpAddFun addFun; //函数指针
hDll = LoadLibrary("..//Debug//dllTest.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "add");
if (addFun != NULL)
{
int result = addFun(2, 3);
printf("%d", result);
}
FreeLibrary(hDll);
}
return 0;
}
分析上述代码,dllTest工程中的lib.cpp文件与第2节静态链接库版本完全相同,不同在于lib.h对函数add的声明前面添加了__declspec(dllexport)语句。这个语句的含义是声明函数add为DLL的导出函数。DLL内的函数分为两种:
(1)DLL导出函数,可供应用程序调用;
(2) DLL内部函数,只能在DLL程序使用,应用程序无法调用它们。
而应用程序对本DLL的调用和对第2节静态链接库的调用却有较大差异,下面我们来逐一分析。
首先,语句typedef int ( * lpAddFun)(int,int)定义了一个与add函数接受参数类型和返回值均相同的函数指针类型。随后,在main函数中定义了lpAddFun的实例addFun;
其次,在函数main中定义了一个DLL HINSTANCE句柄实例hDll,通过Win32 Api函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDll;
再次,在函数main中通过Win32 Api函数GetProcAddress得到了所加载DLL模块中函数add的地址并赋给了addFun。经由函数指针addFun进行了对DLL中add函数的调用;
最后,应用工程使用完DLL后,在函数main中通过Win32 Api函数FreeLibrary释放了已经加载的DLL模块。
通过这个简单的例子,我们获知DLL定义和调用的一般概念:
(1)DLL中需以某种特定的方式声明导出函数(或变量、类);
(2)应用工程需以某种特定的方式调用DLL的导出函数(或变量、类)。
下面我们来对“特定的方式进行”阐述。
4.2 声明导出函数
DLL中导出函数的声明有两种方式:一种为4.1节例子中给出的在函数声明中加上__declspec(dllexport),这里不再举例说明;另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。
下面的代码演示了怎样同.def文件将函数add声明为DLL导出函数(需在dllTest工程中添加lib.def文件):
; lib.def : 导出DLL函数
LIBRARY dllTest
EXPORTS
add @ 1
.def文件的规则为:
(1)LIBRARY语句说明.def文件相应的DLL;
(2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);
(3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。
由此可以看出,例子中lib.def文件的含义为生成名为“dllTest”的动态链接库,导出其中的add函数,并指定add函数的序号为1。
- VC++动态链接库(DLL)编程深入浅出之二(1)——非MFC dll
- VC++动态链接库编程(二)之非MFC DLL
- VC++动态链接库(DLL)编程(二)--非MFC DLL
- VC++动态链接库编程之非MFC DLL
- VC++动态链接库编程之非MFC DLL
- VC++动态链接库编程之非MFC DLL
- VC++动态链接库编程之非MFC DLL
- VC++动态链接库编程之非MFC DLL
- VC++动态链接库编程之非MFC DLL
- VC++动态链接库编程之非MFC DLL
- VC++动态链接库编程之非MFC DLL
- VC++动态链接库编程之非MFC DLL
- VC++动态链接库编程之非MFC DLL
- VC++动态链接库编程之非MFC DLL
- VC++动态链接库编程之非MFC DLL
- VC++动态链接库编程之非MFC DLL
- VC++动态链接库编程之非MFC DLL
- VC++动态链接库编程之非MFC DLL
- SSH中的web.xml配置
- c++ DLL编程之二
- 测试脚本语言概述(转)
- 基于Scrum方法的敏捷项目管理
- VC++动态链接库(DLL)编程深入浅出之一
- VC++动态链接库(DLL)编程深入浅出之二(1)——非MFC dll
- Scrum管理
- android_HelloWorld的实现
- VC++动态链接库(DLL)编程深入浅出之二(2)
- VC++动态链接库(DLL)编程深入浅出之二(3)
- 在Linux下使用script命令记录数据库操作
- VC++动态链接库(DLL)编程深入浅出之三(1)——MFCdll
- mydate97控件禁用日期的问题,请高手赐教
- symbian 退出原因