一、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目录

五、完整项目下载

https://download.csdn.net/download/qq_40754866/18900492

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐