本文回顾学习一下Windows动态链接库:dll与exe相互调用问题。一般滴,exe用来调用dll中的类或函数,但是dll中也可以调用exe中的类或函数,本文做一些尝试总结。

dll程序:

Calculator.h 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
// Calculator.h: interface for the Calculator class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_ALCULATOR_H__D072BBB5_615B_45A9_9864_80C2291FA695__INCLUDED_)
#define AFX_ALCULATOR_H__D072BBB5_615B_45A9_9864_80C2291FA695__INCLUDED_

#pragma once
#endif // _MSC_VER > 1000

class IHelper;
class Helper;
class _declspec(dllexport) Calculator
{
public:
    Calculator();
    ~Calculator();

void registerHelper(IHelper *iHelper);
    void registerHelper(Helper  *helper);
    
    int add(int num1, int num2);
    int sub(int num1, int num2);
    
private:
    IHelper     *m_iHelper;
    Helper      *m_helper;
    
};

extern "C" _declspec(dllexport) Calculator *getCalculator();

#endif // !defined(AFX_ALCULATOR_H__D072BBB5_615B_45A9_9864_80C2291FA695__INCLUDED_)

 Calculator.cpp 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
// Calculator.cpp: implementation of the Calculator class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Calculator.h"
#include "../vs_dll_caller/Helper.h"

#include "../vs_dll_caller/Helper.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Calculator::Calculator()
{
    
}

Calculator::~Calculator()
{
    
}

void Calculator::registerHelper(IHelper *iHelper)
{
    m_iHelper = iHelper;
}

void Calculator::registerHelper(Helper *helper)
{
    m_helper = helper;
}

int Calculator::add(int num1, int num2)
{
    m_iHelper->print("do add!");
    return num1 + num2;
}

int Calculator::sub(int num1, int num2)
{
    m_iHelper->print("do sub!");
    ;
}

Calculator *getCalculator()
{
    return new Calculator();
}

exe程序:

 IHelper.h
1
2
3
4
5
6
7
8
9
10
11
 
#pragma once
/************************************************************************/
// 抽象类                                                               */
// 该类在exe中,方便dll中调用
/************************************************************************/

class IHelper
{
public:
    ;
};

 Helper.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
// Helper.h: interface for the Helper class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_HELPER_H__9234DC8C_56CC_4765_BDA6_276F30C52221__INCLUDED_)
#define AFX_HELPER_H__9234DC8C_56CC_4765_BDA6_276F30C52221__INCLUDED_

#pragma once
#endif // _MSC_VER > 1000

#include "iHelper.h"

class Helper
    : public IHelper  
{
public:
    Helper();
    virtual ~Helper();

virtual void print(const char *str);

};

#endif // !defined(AFX_HELPER_H__9234DC8C_56CC_4765_BDA6_276F30C52221__INCLUDED_)

 Helper.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
// Helper.cpp: implementation of the Helper class.
//
//////////////////////////////////////////////////////////////////////

#include "Helper.h"
#include <iostream>

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Helper::Helper()
{

}

Helper::~Helper()
{

}

void Helper::print(const char *str)
{
    std::cout << str << " ";
}

 main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
#include <Windows.h>
#include <tchar.h>
#include <iostream>
#include "Helper.h"
#include "../vs_dll/Calculator.h"

typedef Calculator*(*Cal)();

int main()
{
    std::cout << "Hello World!\n";

// 隐式调用
    std::cout << "\n隐式调用" << std::endl;
    Calculator cal;
    // 回调指针给dll
    IHelper *helper = new Helper();
    cal.registerHelper(helper);
    );
    std::cout << "cal.add = " << num_add << std::endl;
    );
    std::cout << "cal.sub = " << num_sub << std::endl;

// 显式调用
    std::cout << "\n显式调用" << std::endl;
    HMODULE hDll = ::LoadLibrary("../Debug/vs_dll.dll");
    if (hDll != NULL)
    {
        Cal cal = (Cal)GetProcAddress(hDll, "getCalculator");
        Calculator *pCal = cal();
        // 回调指针给dll
        IHelper *helper = new Helper();
        pCal->registerHelper(helper);
        );
        std::cout << "pCal->add = " << num_add << std::endl;
        );
        std::cout << "pCal->sub = " << num_sub << std::endl;

}

std::cin.get();
    ;
}

总结:一般滴,dll是用来被exe调用的,如果dll要调用exe中的类,可以给dll注册一个该类的指针即可,而且该指针为抽象类指针。

Windows动态链接库:dll与exe相互调用问题的更多相关文章

  1. Golang编写Windows动态链接库(DLL)及C调用范例

    一.准备. 1.GoLang在1.10版本之后开始支持编译windows动态链接库,可以打开命令行工具使用go version 查看自己的go版本. 2.你的电脑上需要gcc,如果没有的话[点击这里] ...

  2. Windows 动态链接库DLL使用

    转载:https://blog.csdn.net/heyabo/article/details/8721611 转载:https://www.cnblogs.com/jin521/p/5598529. ...

  3. windows c dll的创建与调用

    DLL代码: // TestDynamic.cpp: implementation of the TestDynamic class. // ///////////////////////////// ...

  4. Windows动态链接库DLL

    1.什么是DLLDLL,即动态链接库,是包含若干个函数的库文件,可供其他程序运行时调用. 2.DLL的优缺点优点:代码重用,可供多个程序同时调用 缺点:易发生版本冲突当新版本的动态链接库不兼容旧版本时 ...

  5. C/C++/动态链接库DLL中函数的调用约定与名称修饰

    参见:http://blog.twofei.com/cc/impl/calling-convension.html 调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用 ...

  6. DLL与EXE之间的通讯调用 以及 回调函数的线程执行空间

    dll 与 exe 之间的通讯方式有很多种, 本文采用回调函数的方法实现, 本文也将研究多线程,多模块的情况下,回调函数所在的线程, 啥也不说了,先附上代码: 下面的是dll模块的的, dll的工程文 ...

  7. VC++动态链接库(DLL)编程深入浅出(zz)

    VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...

  8. VC++动态链接库(DLL)编程深入浅出

    1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了“无库-静 ...

  9. VC++动态链接库(DLL)编程深入浅出(一)

    1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了“无库-静 ...

随机推荐

  1. UITableViewStyleGrouped 类型 tableView sectionHeader 高度问题

    UITableViewStyleGrouped 类型的 tableView 在适配的时候出现很大的问题.记录一下 按照之前的方法,只需要执行以下的代码就能够很好的解决 section == 0 的时候 ...

  2. 【Android】基于A星寻路算法的简单迷宫应用

    简介 基于[漫画算法-小灰的算法之旅]上的A星寻路算法,开发的一个Demo.目前实现后退.重新载入.路径提示.地图刷新等功能.没有做太多的性能优化,算是深化对A星寻路算法的理解. 界面预览: 初始化: ...

  3. 概要设计文档(final)

    1. 引言部分 引言部分主要说明编写目的.系统的范围和参考资料等. 1.1目的 该文档的目的是描述“自习吧”微信小程序的概要设计,主要内容包括系统功能简介.系统结构设计.模块设计和界面设计等. 本文档 ...

  4. [20191002]函数dump的bug.txt

    [20191002]函数dump的bug.txt --//前几天写raw转化oracle number脚本,在使用函数dump时遇到一些问题,做一个记录:--//oracle number 0 编码 ...

  5. spark streaming整合kafka

    版本说明:spark:2.2.0: kafka:0.10.0.0 object StreamingDemo { def main(args: Array[String]): Unit = { Logg ...

  6. Shell脚本(1)

    在创建Shell脚本时,必须在文件的第一行指定要使用的shell.格式为:#!/bin/bash 除了第一行外,在shell脚本中井号(#)用作注释行 若出现错误:command not found ...

  7. svn 在Windows下用TortoiseSVN checkout 时报认证错误

    TortoiseSVN 第一次 checkout(检出)时,需要输入用户名密码,如果第一次你保存了你的用户名密码,那么这个检出的项目以后就会用这个用户名密码,如果你的密码改了之后,就会报一个认证错误的 ...

  8. Ubuntu安装DaVinci Resolve

    安装DaVinci Resolve所需依赖 sudo apt install libssl1.0.0 ocl-icd-opencl-dev fakeroot xorriso 下载MakeResolve ...

  9. K8S 1.14.6中,将kubeadm集群证书颁发时间延长到100年

    更改两个文件,重新编译kubeadm. 1,D:\kubernetes-1.14.6\staging\src\k8s.io\client-go\util\cert\cert.go // NewSelf ...

  10. 平方,立方,n次方,上标/下标

    选种你需要的上标,如2,右键设置单元格格式:选择上标,确定即可: 最终效果: