血泪教训:务必注意是生成realease版本的dll,免得其它软件/平台调用的时候查错查半天
A:创建目标dll文件
1.首先创建生成dll的项目,两种途径,基于MFC和基于Win32控制台应用程序(示例)
2.文件->新建->项目->win32控制台应用程序,程序类型选择DLL,勾选为空项目
3.菜单栏项目->添加头文件,myAPI.h代码如下
#ifndef _DLL_API
#define _DLL_API _declspec(dllexport)
#else
#define _DLL_API _declspec(dllimport)
#endif
extern "C" _DLL_API int ADD(int a,int b);//自定义的函数接口
4.菜单栏项目->添加对应的源文件myAPI.cpp,函数定义,代码如下
#include "myAPI.h"
int ADD(int a,int b)
{
return a+b;
}
5.编译通过,在相应工程名目录下的debug目录下会生成文件,后面只需要myAPI.dll和myAPI.lib
B:dll文件的调用的两种方式
静态调用lib文件
1.新建项目myTest,先编译,使项目具有debug目录,将myAPI.h存放在该目录
2.将myAPI.lib文件放在与源文件和头文件相同的目录下
3.将lib资源添加到项目中,在新项目的主函数中,添加代码
#pragma comment(lib,"myAPI.lib")
4.调用的时候,直接调用函数就好了
cout<<ADD(3,5)<<endl;
动态调用dll文件
一般而言,LoadLibrary函数就可以,但是如果存在当前dll调用外部dll的情况,很容易出现GetLastError为126或193的错误,
所以建议使用LoadLibraryEx函数,避免dll依赖错误
typedef int(*ADD)(int a,int b);
HMODULE hdll = LoadLibraryEx(L"myAPI.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);//vs2010 将__TEXT置换为_T
if (hdll != NULL)
{
ADD myADD= (ADD)GetProcAddress(hdll, "ADD");
if (RecordCheck != NULL)
{
int result= myADD(3,5);
}
}
else
{
//MessageBox(0,L"Load Dll Fail",L"Warnning",0);
}
FreeLibrary(hdll);
关于dll加载的三种方式
1.LoadLibrary 一般是动态加载DLL时(你并不需要对应的头文件,和LIB)
2.#pragma comment 一般是静态加载DLL时(对应的头文件、DLL,和LIB缺一不可,并且生产的EXE没有找到DLL文件就会导致“应用程序初始化失败”)
3.#import指令用于从一个类型库中结合信息。该类型库的内容被转换为C++类,主要用于描述COM界面