程序中不需要引用lib库和头文件就可以加载dll,此时需要动态加载,此方法特别常用:
dll库的生成:
vs新建项目-->dll项目,勾选预编译头-->创建,例如项目名称myDll
成功后会生成dllmain.cpp和stdfx.h,stdfx.cpp,stdfx.h,targetver.h和一个主文件myDll.cpp,我们把需要导出的函数都放在myDll.cpp中,这里不需要头文件;
在myDll.cpp中写入函数,例如
extern "C" _declspec(dllexport) int add(int a ,int b)
{
return a+b;
}
/*extern "C" _declspec(dllexport) 为修饰符,表示此函数将被导出;*/
然后点击生成,按需求生成64或32位版本的dll;
dll库的动态加载:
vs新建项目-->win32项目-->空项目,例如项目名称为useMyDll
添加main.cpp:
#include <iostream>
#include <windows.h>
typedef int(*Function)(int ,int ) //此处Function代表函数的类型,后面括号代表函数的参数
int main()
{
Function add=NULL:
HINSTANCE hdll=LoadLibrary("myDll.dll"); //此处将myDll.dll放在程序的当前目录下
if(hdll==NULL) //dll加载失败
{
std::cout<<GetLastError()<<std::endl;
FreeLibrary(dll); //释放资源
return 0;
}
//这里加载dll中的函数,“add”代表所调用的dll中的函数名称
add=(Function)GetProcAddress(hdll, "add");
if(add==NULL) //函数加载失败,可能函数名写错,dll无此函数
{
std::cout<<GetLastError()<<std::endl;
FreeLibrary(dll); //释放资源
return 0;
}
int result=add(1,1); //调用函数
std::cout<<"result:"<<std::endl;
return 0;
}