建立动态链接库DLL

时间:2022-07-30 15:49:13

建立动态链接库DLL有两种方式,一种是MFC应用程序向导,一种是Win32方式建立,初学者利用MFC的AppWizard(dll),可以快速建立DLL框架,然而更推荐用Win32方式创建,代码精炼。如图新建一DLL工程,为了与应用程序相区别,DLL名字前加一大写字母U,选择OK。

建立动态链接库DLL

有三种DLL可以选择,这里选择第三个,包含导出符号的DLL,选择Finish。

建立动态链接库DLL

将给出Dll项目的一些信息,确定无误后点击OK。就生成了一个基本的DLL骨架。

建立动态链接库DLL

我们可以看看VC为我们生成了哪些内容。

建立动态链接库DLL                                  建立动态链接库DLL

在类视图中我们可以看到有两个函数DllMain这是Dll的入口函数,还有一个fnUDLL,这是一个示例函数,并没有实际作用。

此外还有一个CUDLL类,这是DLL的导出类,你可以为这个导出类添加成员变量和数据成员。

我们可以仔细看下文件视图中都有哪些内容。

1.首先是StdAfx.h 

这里面只有一句对我们有用

#include <windows.h>
所有Windows程序都要包含这一头文件,它包含了其他Windows头文件,这些头文件中最重要的和最基本的是:
  WINDEF.H 基本型态定义。
  WINNT.H 支援Unicode的型态定义。
  WINBASE.H Kernel函数。
  WINUSER.H 使用者界面函数。
  WINGDI.H 图形装置界面函数。
  这些头文件定义了Windows的所有资料型态、函数调用、资料结构和常数识别字,它们是Windows文件中的一个重要部分。

2.StdAfx.cpp中只有一句

#include "stdafx.h"

3. 接着看UDll.h文件。

#ifdef UDLL_EXPORTS
#define UDLL_API __declspec(dllexport)
#else
#define UDLL_API __declspec(dllimport)
#endif

// This class is exported from the UDll.dll
class UDLL_API CUDll {
public:
int add();
int a;
CUDll(void);
// TODO: add your methods here.
};
extern UDLL_API int nUDll;
UDLL_API int fnUDll(void);

最上面ifdef语句

#ifdef UDLL_EXPORTS

#define UDLL_API __declspec(dllexport)

#else

#define UDLL_API __declspec(dllimport)

#endif

最上面两句#ifdef UDLL_EXPORTS#define UDLL_API __declspec(dllexport)#else#define UDLL_API __declspec(dllimport)#endif给出了预编译,如果没有定义UDLL_EXPORTS则定义为导出,否则为导入,样在Dll源文件和引用Dll的文件中都可以分别使用函数名称,避免了定义dllexport和dllimport的麻烦。

接着,定义了一个导出类CUDll,并声明了 为int 型的数据成员a和成员函数add,和类的构造函数CUDll。在类名称之前添加的UDLL_API表面类的所有成员函数和数据成员都可以导出,如果只想导出类的部分成员函数或数据成员,则要把类声明前的UDLL_API去掉,在相应的要导出的成员函数或数据成员之前加UDLL_API。此外,还声明了一个导出数据 int nUDll和一个导出函数fnUDll。具体的实现则可以在.cpp文件中找到。

   

 4.下面看最后一个文件UDLL .cpp

 
 
 
 
 
 
 
 
 
 
 
 
 
 
#include "stdafx.h"
#include "UDll.h"

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;

}

// This is an example of an exported variable
UDLL_API int nUDll=0;

// This is an example of an exported function.
UDLL_API int fnUDll(void)
{
return 42;
}

// This is the constructor of a class that has been exported.
// see UDll.h for the class definition
CUDll::CUDll()
{
return;
}



int CUDll::add()

{



}

首先是DLl的入口函数DllMain,接着是导出数据的示例,然后是一个导出函数实现的示例,和类的构造函数和成员函数。跟普通的C++源文件一样,所不同的只是需要在导出函数和数据之前加UDLL_API。因为类的声明之前已经加了UDLL_API则其所有成员和函数都是导出的,则不需要再写UDLL_API声明。

5.DLL编译连接

给UDll.cpp的int CUDll::add()函数体内添加

                return 0;

编译链接可以生成相应的文件。我们需要的是UDLL.dll文件和相应的UDll.lib导入库文件,默认生成在Dubug目录下。

建立动态链接库DLL

6.改变生成库的默认目录. 为了更好地组织结构,建立工程时一般建立如下几个文件。

建立动态链接库DLL

其中:

XXX_Src文件夹中存储工程源代码;

Debug文件夹中存储动态库dll的Debug版本以及工程执行文件的Debug版本;

Release文件夹中存储动态库dll的Release版本以及工程执行文件的Release版本;

Include文件夹中存储动态库的头文件和一些全局变量定义文件;

Lib文件夹中存储动态库的lib文件(Debug和Release版本);

Data文件夹存储一些执行文件所需要的配置文件。

 

首先关掉VC编译器,建立上图所示几个文件夹,并把已经生成的Debug文件夹下的文件删除掉,把其余文件移动到UDll_Src文件夹下。

重新打开VC6.0编译器,打开工作区,在菜单栏选择Projects->Settings。

左边选择Win32 Debug版,General中Output Files输入..\Lib,因为当前目录是UDll_Src,..\表示上一级目录,也就是上图所显示的六个子文件夹目录,lib表示此目录下的Lib文件夹,这里设置的是.lib导入库的路径。选择Link,General选项,选择Output File name:把名字改为../Debug/UDll_D.dll,..\和../和.\和./都表示上级目录,这里文件名加_D表示是Debug版,Link下设置的是 .Dll的路径和生成的名字,同时生成的.lib与此dll文件同名。点击OK完成设置。

建立动态链接库DLL建立动态链接库DLL

Release版的设置与此相同,不过Dll文件名最后一个字母要改为R代表Release。

建立动态链接库DLL建立动态链接库DLL

编译、链接,可以看到在Lib目录下生成了UDll_D.lib文件,在Debug目录下生成了UDll_D.dll文件。

建立动态链接库DLL

建立动态链接库DLL