使用Visual Studio来创建动态库
第一步新建一个控制台程序
第二步去掉SDL安全开发周期,以及选中创建DLL空项目
在资源管理器中添加.h和.cpp文件
在.h文件里可以写上函数的声明:
#pragma once //编译器命令 once头文件卫士
extern "C"/*以C的方式编译这段函数*/ __declspec(dllexport)/*将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。
*/ int Add(int a,int b);
.cpp文件
#include "testdllh.h"
int Add(int &a, int &b)
{
return a + b;
}
这里不能直接编译,因为直接编译会生成dll,dll是无法直接运行的,所以这里我们选择生成:
上面表示生成成功,我们这里来调用dll试试:
代码如下:
#include "testdllh.h"
#include <stdio.h>
#include <windows.h>
int main(){
HINSTANCE h = LoadLibraryA("ConsoleApplication10.dll"); //加载动态库
typedef int(*FunPtr)(int a, int b);//定义函数指针来指向Dll动态库里的函数
if (h == NULL)
{
FreeLibrary(h);
printf("load dll error\n");
}
else{
FunPtr funPtr = (FunPtr)GetProcAddress(h, "Add"); //获取动态库里指定函数文件偏移首地址
if (funPtr != NULL)
{
int result = funPtr(3, 3); //调用函数
printf("3 + 3 = %d \n", result);
}
else{
printf("error add");
}
}
printf("dd");
getchar();
}
运行结果:
下面来介绍一下上面用的三个函数:
LoadLibraryA、FreeLibrary、GetProcAddress函数是Windows为用户提供的用于载入动态库函数的接口
LoadLibraryA
函数原型:
HMODULE WINAPI LoadLibrary( _In_ LPCTSTR lpFileName);
_In_ LPCTSTR lpFileName:要加载的动态库路径
返回值:
成功返回引用模块句柄
FreeLibrary
函数原型:
WINBASEAPI
BOOL
WINAPI
FreeLibrary(
_In_ HMODULE hLibModule
);
_In_ HMODULE hLibModule; LoadLibrary返回的动态库模块句柄
返回值:成功返回true,否则返回false
GetProcAddress
函数原型:
FARPROC GetProcAddress(
HMODULE hModule, // DLL模块句柄
LPCSTR lpProcName // 函数名
);
返回值:返回DLL模块文件中指定函数首地址/入口地址
除此之外也可以直接使用Visual Studio来包含DLL库,首先上面我们编译生成DLL的时候其实还有一个lib库文件:
将lib库文件copy到我们的项目路径下,在将dll文件根据你的系统位数copy到System32/SysWOW64目录下
在项目属性里直接引用:
在运行:
运行结果:
注意这里说一下为什么dll会生成lib文件?
Lib里面包含了dll的描述信息,比如函数符号表,偏移地址等信息,而非实际代码,所以我们在vside里面包含这个Lib文件,vs在编译器期间会自动读取lib配置信息,然后去系统指定动态库目录加载dll库!
编译器只会在编译时间用到lib文件来获取dll库里的某些信息,并不会被加载到程序当中!
静态库:
添加.h和.cpp
.h文件:
#pragma once //编译器命令 once头文件卫士
extern "C"/*以C的方式编译这段函数*/ __declspec(dllexport)/*将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。
*/ int Add(int a, int b);
.cpp文件:
#include "libh.h"
int Add(int &a, int &b)
{
return a + b;
}
生成:
使用编译器命令comment加载:
#include "libh.h"
#include <stdio.h>
#pragma comment(lib,"ConsoleApplication12.lib") //加载静态库
int main(){
int result = Add(3, 3); //调用函数
printf("3 + 3 = %d \n", result);
printf("dd");
getchar();
}
运行结果:
相关连接:C/C++函数调用约定