1、 DLL的概念
静态链接库与动态链接库的区别:
(1)静态链接库与动态链接库都是共享代码的方式。静态链接库把最后的指令都包含在最终生成的EXE文件中了;动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。
(2)静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
(3) 在使用动态库的时候,往往提供两个文件:一个引入库文件.lib,一个.dll文件。引入库文件包含DLL导出的函数和变量的符号名,而.dll包含实际的函数和数据。在使用动态库的情况下,在编译链接可执行文件时,只需要链接.lib引入库文件,该DLL中的函数代码和数据并不复制到.exe中,直到执行时才去加载所需的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出函数。
创建DLL项目
新建项目:visual c++->win32->win32控制台应用程序
项目名称:MyDLL->确定->下一步->DLL(附加选项 对空项目打钩)->完成
解决方案里出现新建立的MyDLL项目:
1、新两个文件MyDLL.cpp,MyDLL.h
// mydll.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "mydll.h"
int Add(int & a,int & b)
{
return a + b;
}
extern "C" cc_dll int Sub(int & a,int & b)
{
return a - b;
}
Data::Data(int _data)
{
m_data=_data;
}
int Data::getData()
{
return m_data;
}
void Data::setData(int _data)
{
m_data=_data;
}
//为了让DLL导出一些函数,需要在每个将要导出的函数前面添加标识符__declspec(dllexport)
其中 extern “C”为声明为C编译。由于C++编译器在编译的时候会造成其函数名的该变,在其他应用程序中导致函数不可调用,而C编译器则不会在编译后改变其函数名。
-----MyDLL.h
#pragma once
#ifndef cc_dll
#define cc_dll __declspec(dllexport)
#endif
extern "C" cc_dll int Add(int & a,int & b);
class cc_dll Data
{
public:
Data(int _data);
int getData();
void setData(int _data);
private:
int m_data;
};
2、建立测试项目
新建项目:visual c++->win32->win32控制台应用程序
静态调用(隐式动态链接)
将生成的.dll和.lib文件拷入到调用dll的工程中,用命令
--TestDLL.cpp : 定义控制台应用程序的入口点。
// test_dll.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
#pragma comment(lib,"MyDLL.lib")
#ifndef DLL_API
#define DLL_API _declspec(dllimport)//_declspec(dllimport) 表明函数是从动态链接库中引入的
#endif
extern "C" DLL_API int Add(int &a,int &b);
extern "C" DLL_API int Sub(int &a,int &b);
extern "C" DLL_API class Data
{
public:
Data(int _data);
int getData();
void setData(int _data);
private:
int m_data;
};
int _tmain(int argc, _TCHAR* argv[])
{
int a=13;
int b=14;
Data _Data(0);
cout<<"a+b="<<Add(a,b)<<endl;
cout<<"a-b="<<Sub(a,b)<<endl;
cout<<_Data.getData()<<endl;
_Data.setData(100);
cout<<_Data.getData()<<endl;
getchar();
return 0;
}
3、配制测试项目:选中项目,右键
项目->属性->配置属性->VC++ 目录-> 在“包含目录”里编辑添加头文件MyDLL.h所在的目录
项目->属性->配置属性->VC++ 目录-> 在“库目录”里编辑添加库文件MyDLL.lib所在的目录
项目->属性->配置属性->链接器->输入-> 在“附加依赖项”里编辑添加“MyDLL.lib”
4、将MyDLL.dll复制到生成的TestDLL.exe目录下。
DLL动态链接库:lib为动态链接库的引导库,项目对会先复制一份,在生成.exe。但.dll项目不会复制一份在生成.exe目录下,需要手动拷贝。
二 导出类