本文回顾学习一下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. HOW TO: Setting up Encrypted Communications Channels in Oracle Databas

    access_timeSeptember 22, 2015 person_outlineMartin Rakhmanov share In this article, I will explain h ...

  2. 5-4 可视化库Seaborn-回归分析

    In [2]: %matplotlib inline import numpy as np import pandas as pd from scipy import stats,integrate ...

  3. Shell命令-用户用户组管理之id、su

    文件及内容处理 - id.su 1. id:查看用户的uid,gid及归属的用户组 id命令的功能说明 id 命令用于显示用户的 ID,以及所属群组的 ID.id 会显示用户以及所属群组的实际与有效I ...

  4. 11.Java基础_IDEA常用快捷键

    /* 内容辅助键: psvm 回车 : 快速生成main方法: sout 回车 : 快速生成输出代码 Ctrl+Alt+Space : 内容提示,代码补全 快捷键: 注释: 单行: 选中代码, Ctr ...

  5. 后台传给前端字符串为null或解析JSON字符错误——SyntaxError: JSON.parse: unterminated string literal at line 1 column 9018638 of the JSON data

    第一种情况: 第二种情况: 首先看看你的JSONObject或JSONArray的引用有没有Getter()和Setter()方法,这个必须要加上 问题:两张表双向多对一.一对多时.响应给后台使,出现 ...

  6. IEEE754 浮点数

    IEEE754 浮点数 1.阅读IEEE754浮点数 A,阶码是用移码表示的,这里会有一个127的偏移量,它的127相当于0,小于127时为负,大于127时为正,比如:10000001表示指数为129 ...

  7. Python网络编程基础 ❶ 计算机网络基础 初用socket模块

    1.计算机网络基础 C/S  客户端/服务器端 B/S  浏览器端/服务器端 mac地址,ip地址,子网掩码,与计算得到网段,端口号每台计算机的网卡都有全球唯一的地址,在生产时已经写进去了. ip地址 ...

  8. python实现定时任务那些你不知道的模块

    一.使用time中的sleep 这种方式最简单,在循环里放入要执行的任务,然后sleep一段时间在执行 from datetime import datetime import time # 每n秒执 ...

  9. MySQL实战45讲学习笔记:第三十三讲

    一.引子 我经常会被问到这样一个问题:我的主机内存只有 100G,现在要对一个 200G 的大表做全表扫描,会不会把数据库主机的内存用光了? 这个问题确实值得担心,被系统 OOM(out of mem ...

  10. vs安装包离线下载

    1.首先打开visual studio 的官网下载最新的安装程序. https://www.visualstudio.com/zh-hans/?rr=https%3A%2F%2Fwww.baidu.c ...