天天看点

DLL 动态和静态导入

在这里只谈动态库DLL

1 创建DLL(可以选择有入口函数或没有)

  三步:

      第一步,声明,分为.h和.def两个方式:

      A 格式:#ifndef LIB_H

              #define LIB_H

              extern "C" int _declspec(dllexport) add(int x,int y);

              #endif

      B 格式:LIBRARY test                            //dll的名字

              EXPORTS

              add @ 1                                 //1为序号,可随意指定

     第二步,实现文件.cpp,其中第一步若采用.h,只需在.cpp中加入#include "lib.h"

     第三步,编译,然后构建dll文件,B格式比A格式要多生成一个lib文件

2 在自己的应用程序中调用DLL(分为静态调用和动态调用两种)

  静态调用:

          #pragma comment(lib,"test.lib");

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

          在程序中调用add的时候自动调用

  动态调用:

          A 宏定义函数指针类型:typedef int (*lpAddFun)(int,int);

          B 定义DLL句柄和函数指针:HINSTANCE hDll;

                                   lpAddFun addFun;

          C 动态调用:dDll=LoadLibrary("……//test.dll");

                      addFun=(lpAddFun)GetProcAddress(hDll,"add");

          D 动态销毁:FreeLibrary(hDll)

备注:以上是关于导出函数的操作,关于导出变量的操作完全与上述相同。

关于导出类的操作稍有不同,下面给出一个简单的示例,分为四步:

1 定义.h文件:

            #ifndef POINT_H

            #define POINT_H

            #ifdef DLL_FILE

            class _declspec(dllexport) point

            #else

            class _declspec(dllimport) point

            #endif

            {

            public:

               float x;

               float y;

               point();

               point(float x_cor,float y_cor);

            } 

            #endif

2 定义.cpp文件:

            #ifndef DLL_FILE

            #define DLL_FILE

            #endif

            #include "point.h"

            point::point()

            {

                x=0.0;

                y=0.0;

            }

            point::point(float x_cor,float y_cor)

            {

                x=x_cor;

                y=y_cor;

            }

3 编译并构建,会产生.dll和.lib

4 静态调用:

          A #include "point.h"

          B #pragma comment(lib,"**.lib");

          C 根据类名自动调用