Window下 动态链接库的生成和使用(简单 实用)

以下全部是以vs2013下为例 进行说明,即   动态库用vs2013生成; 同时用vs2013 调用动态链接库

先说静态链接库:

            生成的静态链接库中,只有两个文件有用:  *. h 文件 和  .lib文件   

            .h 文件用来声明, .lib文件包含函数的索引以及实现等 。

       在调用该动态链接库的程序中,只需写入两条语句即可 ,例如   #include"jiajianchengchu.h"   和  #pragma comment(lib,"./jiajianchengchu.lib")

             通过上述两条语句我们知道:都是 # 号 开头,说明在 预处理阶段就被替换,因此 .h文件 和 .lib文件的位置 真心不重要, 放在什么位置都可以,只需要到时候包含进来即可。这非常重要!!!    
           一般而言我们把 .h文件 和 .lib文件 和 调用程序的.cpp放在一块,因为这样的话 我们写路径时就可以很方便,比如上述的 
             #include"jiajianchengchu.h"
           
 #pragma comment(lib,". / jiajianchengchu.lib")  #pragma comment(lib,"jiajianchengchu.lib")
就是采用的相对路径写法。

 

再说动态链接库:

        动态静态链接库中,三个文件可能会有用:  *. h 文件 和  .lib文件 .dll文件  
不过 .lib中并没有存储函数实现等,只是存储的链接程序所必须的信息。  dll文件存储的是函数的具体实现。


隐式调用时候
      .h 文件 和 .lib 文件的用法跟静态链接库的用法完全相同(上述紫色的话非常重要!!!),都是用那两条语句,都是跟cpp放在一块。不同的是:加载时会去找.dll文件的位置。
     关于dll的存放位置有三个地方可以放:
            1、跟程序exe放在一块,(即debug文件夹下,注意是解决方案下的那个debug文件夹,不是项目下的那个debug)

            2、跟.cpp放在一块  (即 .h  .lib  .dll  .cpp  都放在了一块)
            3、放在系统目录下system32文件夹或system64文件夹下

            4、环境变量所列出的路径下
 一般而言 dll都跟exe放在一块,即 debug文件夹下。

显式调用时候(很简单,不要想的太难,请看书)
     
   只用到.dll文件,只需要把.dll文件放到上述四个文件夹下一个即可(当然还是推荐第一个)。

 

其他还有不懂的请查阅《VC++深入详解这本书》,

一些代码:例如dllmain函数的作用

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"

BOOL APIENTRY DllMain(HMODULE hModule,  //模块调用
	DWORD  ul_reason_for_call,          //调用原因
	LPVOID lpReserved                   //保留参数 不用关心
	)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:       //被其他程序加载时候
		MessageBox(NULL, L"加减乘除DLL被加载", L"l love Mark", MB_OK);
		break;


	case DLL_THREAD_ATTACH:      //当其他程序启动了一个线程的时候
		break;

	case DLL_THREAD_DETACH:      //当其他程序某个线程线程终止运行的时候
		break;

	case DLL_PROCESS_DETACH:     //被其他程序加载的时候
		MessageBox(NULL, L"加减乘除DLL被卸载", L"l love Mark", MB_OK);
		break;
	}
	return TRUE;
}

某个动态链接库的头文件: (关于加不加extern c防止命名倾轧等问题查看VC++深入详解即可)

这样定义的目的有好处
#ifdef DLL1_API       
#else 
#define DLL1_API _declspec(dllimport)   
#endif


所有的函数一定要设置成为导出类型,否则无法生成lib文件,不存在导出的函数
DLL1_API double add(double a, double b);
DLL1_API double subtract(double a, double b);
DLL1_API double multiply(double a, double b);
DLL1_API double chu(double a, double b);

class DLL1_API Point
{
  public:
	  void output(int x, int y);
};

 

你可能感兴趣的:(Window下 动态链接库的生成和使用(简单 实用))