DLL(Dynamic Link Library),动态链接库。
1.关于__declspec(dllimport)和__declspec(dllexport)
在一个DLL的编写过程中,如果要使一个变量、一个函数或一个类能够被外部程序调用,在函数声明上加上__declspec(dllimport)关键字。
例:
引出一个变量:
__declspec(dllexport) int iEx;
引出一个函数:
__declspec(dllexport) int fnEx( int i );
引出一个类:
class __declspec(dllexport) CClassEx
{……};
在外部程序引用DLL时,如果采用隐式调用的方法(关于隐式调用稍后讨论),需要 包含DLL文件相关的头文件,这个头文件用__declspec(dllimport)关键字指出了DLL导出的内容(实际上就是把原来的__declspec(dllexport)全部替换为__declspec(dllimport))。
例:
引入一个变量:
__declspec(dllimport) int iEx;
引入一个函数:
__declspec(dllimport) int fnEx( int i );
引入一个类:
class __declspec(dllimport) CClassEx
{……};
为了提高程序可读性,可以定义如下宏:
#define DllImport __declspec(dllimport)
#define DllExport __declspec(dllexport)
以便使用。
实际上一般定义如下宏:
#ifdef MYDLL_EXPORTS
#define MYDLL_API
__declspec(dllexport)
#else
#define MYDLL_API
__declspec(dllimport)
#endif
这样,在源程序的实现文件中先定义MYDLL_EXPORTS,再包含这个头文件;在外程序内,可以直接包含这个头文件。这种方法可以实现一个文件多种用途。
2.隐式调用和显式调用
隐式调用是最常用的一种调用方法。它需要原DLL文件、原头文件和库文件组成。在程序内要包含这个头文件,并加入库文件一同编译。在程序启动时会把所有隐式调用的DLL文件加载到内存。
如果想在使用的时候才把DLL文件加入到内存的话,可以使用显式调用。显式调用只需要原DLL文件即可,但是使用时必须对知道这个DLL有哪些导出的符号。可以在VS的命令行方式下输入“depends”命令来查看DLL信息。
示例:
隐式调用:
#include
"..\DllTest\DllTest.h"
……
void CallDll(
void )
{
wchar_t wszBuf[ 32 ];
wsprintf( wszBuf, TEXT( "%d" ), fnDllTest( 9 ) );//fnDllTest是DLL文件导出的方法
wprintf( wszBuf );
}
显式调用:
void CallDll(
void )
{
typedef
int (*ADDPROC)(
int i );
ADDPROC Fn;
HINSTANCE hInst = LoadLibrary( L"DllTest.dll" );
if ( NULL == hInst )
{
wprintf( L"Failed on load DLL." );
return;
}
Fn = ( ADDPROC )GetProcAddress( hInst, "fnDllTest" );
//如果导出时使用的是_stdcall,
那么这里我们也应该使用(_stdcall ADDPROC)
if( !Fn )
wprintf( L"Failed on get Process Address." );
else
{
int i;
i = Fn( 9 );
wchar_t wszBuf[ 32 ];
wsprintf( wszBuf, L"%d", i );
wprintf( wszBuf );
}
FreeLibrary(hInst);//释放DLL
/*
* ADDRPROC Add = (ADDPROC)GetProcAddress(hInst, "add");
* 第而个参数也可以使用序号:
* MAKEINTRESOURCE(1)代替函数名.
*/
}
3.注意事项
如果使用C++编程,那么在程序编译的时候会为变量名等符号重命为诸如“?fnDllTest@QAEAAV0”之类的形式,为显式调用带来了不便。针对这个问题,我们可以为要导出的符号加上“extern
“C””修饰符,就可以保持原有名称。但是导出的类名仍然是重命名后的名称,要再研究研究。
最新发现(05-Nov-2007):用extern "C" struct __declspec(dllexport) classname即可按C格式导出类名。
如果你使用MFC生成MFC DLL那么只要做如下定义就可以了class AFX_EXT_CLASS yourClass。
分享到:
相关推荐
Dynamic Link Library,即动态链接库,是Microsoft在Windows操作系统中实现共享函数库概念的一种实现方式,这种库包含了可由多个程序同时使用的代码和数据 它其中windows中 一些作为DLL实现的文件有:ActiveX控件(....
labview调用动态链接库相关说明文档,及调用PMAC动态链接库Pcomm32.DLL的例程(labview called dynamic link library-related documentation, and call PMAC dynamic link library routines Pcomm32.DLL)
使用VS2010开发环境,创建Dynamic Link Library工程,编译生成fortran动态库DLL实例
动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文件,Windows就是将一些主要的系统功能以DLL模块的形式...
动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll、.ocx(包含ActiveX控制的库)或者 ...
动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件.
查看DLL函数工具,纯绿色版,可以将...DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当
DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL 文件,放置于系统中。当我们执行某一个程序时,相应的DLL...
DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中...
DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中...
DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL...
DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。 (二)主要优点: 1、多个应用程序可以共享一个DLL,...
动态链接库英文为DLL,是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可...
DLL指的是动态链接库(Dynamic Link Library),它是一个可以被多个应用程序(甚至是不同语言编写的应用程序)同时调用的可执行二进制文件,是一个可共享的库。DLL是建立在客户/服务器通信的概念上,包含若干函数、...
新建WIN32 Dynamic-link Library工程,工程名为MyDll,选择A simple DLL project类型。
DLL即动态链接库(Dynamic Link Library),是由可被其它程序调用的函数集合组成的可执行文件模块。DLL不是应用程序的组成部分,而是运行时链接到应用程序中。用VB封装VBA代码,可以构建自定义的DLL动态链接库.........
动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文件,Windows就是将一些主要的系统功能以DLL模块的形式...
动态链接库(Dynamic Link Library或者Dynami packet.dll(20张)c-link library,缩写为packet.dll,又称为动态连结库,是微软公司在微软视窗操作系统中实现共享函数库概念的一种实作方式。这类文件中封装了系统正常...
DLL后缀的文件是Dynamic Link Library的缩写,也就是意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序...