动态库基础知识

来源:互联网 发布:10年前让你做淘宝你说 编辑:程序博客网 时间:2024/05/12 04:44

1.     静态库的使用需要库的开发者提供.h.lib文件,使用者需要把这两个文件拷贝到调用静态库的工程目录下。

2.     静态库的编译:先新建一个静态库工程,然后再新建一个.h.cpp文件,对这两个文件进行编译就会生成.lib文件。

3.     静态库的使用需要特殊的方式:

eg #include <stdio.h>

#include " lib.h"

#pragma comment(lib," libTest.lib") //这句话的作用是链接时把.lib文件该工程中的.obj文件链接到一起

int main(int argc,char *argv[])

{

   printf("2+3=",add(2,3));

}

4.     动态库的使用需要库的开发者提供.dll.lib文件,或.dll文件。动态库.dll文件中包含导出函数:可以被应用程序所调用;内部函数:不能被应用程序所调用。所以动态库的使用比静态库多出了一点即需要特殊的声明。

5.     动态库的编译:新建一个动态工程,再新建一个.h文件

#ifndef LIB_H

#define LIB_H

extern "C" int __declspecdllexportadd(int x,int y); //__declspecdllexport)的作用既特殊的声明add()为动态库中的导出函数。

#endif

新建一个.cpp文件

#include "lib.h"

int add(int x,int y)

{

   return x+y;

}

编译就会生成.dll文件,将.dll文件拷贝到你的当前工作目录

动态库的动态调用:需要用到LoadLibrary—Dll加载函数,

GetProcAddress-Dll导出函数的地址获取,FreeLibrary-Dll卸载

  eg #include <stdio.h>

#include <windows.h>

typedef int(*lpFunAdd)(int x,int y);//定义指向函数的指针

int mainint argcchar *argv[]

{

   HINSTANCE hdll;定义一个句柄

   hdll=LoadLibrary(”名称.dll”);

   lpFunAdd addFun//函数指针

   if(hdll!=NULL)

   {

      addFun=(lpFunAdd)GetProcAddress(hdll,”add”);

      if(addFun!=NULL)

      {

         int result=add2,3);

         printf(“%d”,result);

        

}

FreeLibrary(hdll);

}

   return 0;

   }

动态函数的静态调用: 使用更加广泛简单

#include <stdio.h>

#include <windows.h>

#pragma comment(lib,"libtest2.lib")

extern "C" __declspec(dllimport)add(int x,int y);

int main(int argc,char *argv[])

{

   int result=add(2,3);

   printf("%d",result);

   return 0;

}

动态函数的静态调用需要完成两步:1.告诉编译器与dll文件相对应的.lib文件所在位置,.lib文件中包含了.dll文件中的导出函数的文件名和序号,并不包含实际代码,在应用程序中代替.dll文件进行编译2.声明导入函数 extern "C" __declspec(dllimport)add(int x,int y);

.lib,.h,.dll文件的区别??

1.  DllMain函数,windows在加载dll函数时需要一个入口函数,在之前的例子中没有用到是因为系统在找不到DllMain函数时会从其他库中引用一个不做任何操作的DllMain,并不意味着不需要DllMain函数。(默认从其他动态库中加载一个DllMain)该函数不属于导出函数,而是内部函数。

DllMain.cpp:

#include <stdio.h>  //printf函数需要

#include <windows.h> // APIENTRY等需要

BOOL APIENTRY DllMain(HANDLE hModule,

              DWORD _ul_reason_for_call,

              LPVOID lpReserved

              )

{

   switch(_ul_reason_for_call)

   {

   case DLL_PROCESS_ATTACH:

     printf("\nprcess attach of dll");

     break;

   case DLL_THREAD_ATTACH:

          printf("\nthread attach of dll");

     break;

   case DLL_PROCESS_DETACH:

      printf("\nprocess detach of dll");

     break;

   case DLL_THREAD_DETACH:

          printf("\nthread detach of dll");

     break;

   }

   return true;

}

编译

和"lib.cpp","lib.h"连接即可生成.dll和.lib文件,动态库的引用在和上面一样。