在这里只谈动态库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 根据类名自动调用