C++中DLL文件的生成与调用
- 1.先新建一个dLL工程
- 1.文件->新建->项目->visual c++->win32->填写项目名称MyDLL->确定->下一步->DLL(附加选项 对空项目打钩)->完成.
- 2.代码
extern "C"_declspec(dllexport) void maopao(int *p,int count);
void maopao(int *p,int count)
{ int temp=0;
for(int i=1;i<count;i++)
{for(int j=count-1;j>=i;j--)
{ if(p[j]>p[j-1])
{temp=p[j];
p[j]=p[j-1];
p[j-1]=temp;
}
}
}
}
2.动态调用DLL
// TestDll.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<Windows.h> //说明我想用windows32方法来加载和卸载DLL
typedef int(*Dllfun)(int ,int); //用typedef定义一个指针函数类型,这个指针类型,要和你调用的函数类型和参数保持一致
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
Dllfun add;
HINSTANCE hdll; //定一个句柄实例,用来取DLL的实例地址。
hdll=LoadLibrary("Add.dll");//可以直接吧DLL文件copy到测试工程的Debug文件夹下;这里字符串类型是LPSTR,当是unicode字符集的时候会不行,因此要在配置-属性-常规里面把默认字符集“unicode”改成支持多字符扩展即可。
if(hdll==NULL)//取的地址要判断,返回的句柄是否为空,如果为无效句柄,那么要释放加载DLL所占用的内存。
{
FreeLibrary(hdll);
}
add=(Dllfun)GetProcAddress(hdll,"add");//获取函数地址
if(add==NULL)//这里也要判断要函数指针是否为空,如果没取到要求的函数,那么要释放句柄
{
FreeLibrary(hdll);
}
int a=1,b=2,c;
c=add(a,b);//这里不能用函数名来使用函数,因为这个DLL本身不是当前CPP的一部分,而是通过windows去调用.没有在这个工程里声明或者定义,而是暴露出一个头,要指针获取他的地址,通过指针来调用.
cout<<c;
FreeLibrary(hdll);
cin.get();
return 0;
}
3.静态调用DLL
需要.h、.lib、.dll三件套。 这种方式不是很好。需要配置。
新建“控制台应用程序”或“空项目”。
配置如下:(这一点非常重要)
项目->属性->配置属性->VC++ 目录-> 在“包含目录”里添加头文件Add.h所在的目录
项目->属性->配置属性->VC++ 目录-> 在“库目录”里添加头文件Add.lib所在的目录
项目->属性->配置属性->链接器->输入->在“附加依赖项”里添加“Add.lib”(若有多个 lib 则以空格隔开)