c++ vs 创建dll、lib及其调用调试
·
一、DLL
1. 在vs中先新建项目makeDll,选择dll动态链接库项目;
2. 项目创建成功后添加如下文件:

dllFun.h
#pragma once
#include "global.h"
//自己另外定义的类
namespace myFun
{
class MAKE_DLL_EXPORT dllFun
{
public:
int calculateIntSum(int a, int b);
};
}
framework.h
#pragma once
#define WIN32_LEAN_AND_MEAN // 从 Windows 头文件中排除极少使用的内容
// Windows 头文件
#include <windows.h>
global.h
#pragma once
#ifdef MAKE_DLL__LIB
# define MAKE_DLL_EXPORT __declspec(dllexport)
#else
# define MAKE_DLL_EXPORT __declspec(dllimport)
#endif
pch.h
// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。
#ifndef PCH_H
#define PCH_H
// 添加要在此处预编译的标头
#include "framework.h"
#endif //PCH_H
dllFun.cpp
#include "pch.h"
#include "dllFun.h"
namespace myFun
{
int dllFun::calculateIntSum(int a, int b)
{
return (a + b);
}
}
dllMain
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include <iostream>
using namespace std;
extern "C" _declspec(dllexport) void myFun();
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
pch.cpp
// pch.cpp: 与预编译标头对应的源文件
#include "pch.h"
// 当使用预编译的头时,需要使用此源文件,编译才能成功。
注:要添加其他的类或者方法可以依葫芦画瓢!
二、exe
1. vs创建空控制台项目 testDll(我是创建在同一个解决方案里的,结构目录如下)

testDll.cpp
#include <iostream>
#include <windows.h>
#include "dllFun.h"
using namespace std;
typedef void (*myDllFun)(); //定义一个函数指针类型 typedef void (*DLLFUN)(); (注意返回值类型,参数顺序类型都要一样)
int main()
{
//---------------------------隐式调用lib(静态调用)------------------------------------------
/* 隐式调用前需要先做如下配置
1. 项目->属性->配置属性->C/C++ 目录-> 在“附加包含目录”里添加头文件dllFun.h所在的目录
2. 项目->属性->配置属性->连接器->常规 在“附加库目录”里添加头文件makeDll.lib所在的目录
3. 项目->属性->配置属性->链接器->输入-> 在“附加依赖项”里添加“makeDll.lib”(若有多个 lib 则以空格隔开)
*/
myFun::dllFun fun;
int sum = fun.calculateIntSum(3, 5);
//int sum = myFun::dllFun::calculateIntSum(3, 5); //这样使用的话需要把calculateIntSum声明为static成员函数
cout << "This is calculateFun in dll: " << sum << endl;
//----------------------------------显示调用dll(动态调用)-----------------------------------------------
HINSTANCE hdll;
hdll = LoadLibrary("D:\\vs_workSpace\\makeDll\\Debug\\makeDll.dll"); //【这里字符串类型是LPSTR,当是unicode字符集的时候会不行,因此要在工程--属性--常规---默认字符集:把“unicode”改成支持多字符扩展即可】
if (hdll == NULL)
{
FreeLibrary(hdll);
cout << "Dll loaded is fail..." << endl;
getchar();
return -1;
}
myDllFun myFun1; //定义一个函数地址变量
myFun1 = (myDllFun)GetProcAddress(hdll, "myFun"); //获取动态库里面的myFun函数的入口地址
if (myFun1 == NULL)
{
FreeLibrary(hdll);
cout << "DLLaddress loaded is fail..." << endl;
getchar();
return -1;
}
myFun1(); //调用即可
FreeLibrary(hdll); //最后释放内存
std::cout << "This is exe! Hello World!\n";
system("pause");
return 0;
}
2. exe中需要配置的地方如下(主要有3处)
项目->属性->配置属性->C/C++ 目录-> 在“附加包含目录”里添加头文件dllFun.h所在的目录

项目->属性->配置属性->连接器->常规 在“附加库目录”里添加头文件makeDll.lib所在的目录

项目->属性->配置属性->链接器->输入-> 在“附加依赖项”里添加“makeDll.lib”(若有多个 lib 则以空格隔开)

三、运行结果

四、调试dll

只需要设置dll属性如上图就行。
命令:具体到exe路径
工作目录:exe目录
五、完整项目下载
更多推荐
所有评论(0)