vs程序向导选择dll,方法与静态连接库类似
//testdll.h
#pragma once
#ifndef TESTDLL_H_//
#define TESTDLL_H_
#ifdef _DLLAPI
#define DLLAPI _declspec(dllexport)//导入和导出是不一样的,可以在此工程预处理器定义_DLLAPI
#else
#define DLLAPI _declspec(dllimport)//默认不设置预处理定义则会使用导入
#endif
//
//int DLLAPI add(int, int);//cpp导出动态库会自动修改函数名
//int DLLAPI sub(int, int);
extern "C" DLLAPI int add(int, int);//强制用C语言的导出动态库,防止编译器修改函数名
extern "C" DLLAPI int sub(int, int);
#endif
使用dependency软件可查看编译后的dll文件
//C:\Windows\SysWOW64将生成的.dll文件放置到该路径或者system32或者可执行文件的目录下
//引用动态链接库
#include
#include "testdll.h"//再VC++目录中包含
#include <windows.h>//显示加载动态库所需头文件
typedef int(*PADD)(int a, int b);//创建函数指针
typedef int(*PSUB)(int a, int b);
//#pragma comment(lib,"testdll.lib")//隐式调用零一种方法是显式调用
int main()
{
HMODULE hDLL = LoadLibrary(L"./testdll.dll");//加载动态库,路径可以是绝对可以是相对
if (NULL == hDLL)
{
printf("动态库加载失败");
return 0;
}
PADD pAdd = (PADD)GetProcAddress(hDLL, "?add@@YAHHH@Z");//用函数名加载函数所在的地址具体由dependency软件查看DLL文件可知,这种相对安全
PSUB pSub = (PSUB)GetProcAddress(hDLL, "?sub@@YAHHH@Z");//.cpp会自动帮我们修改,.c文件编译的则不会帮我们修改
printf("%d\n", pAdd(5, 6));
printf("%d\n", pSub(7, 2));
FreeLibrary(hDLL);//释放动态库
}