如果学习代码不是为了偷懒那将毫无意义

  • 前言
  • 动态链接库的创立
  • 含蓄的(隐式)调用动态链接库
  • 粗暴的(显式)调用动态链接库
  • 尾言

前言

最近遇到项目上的需求,交接时需要修改底层代码,这让C++二把刀的我十分痛苦。好在通过讨论,甲方愿意通过调用动态链接库的方式接收我方数据。在b站up主老蓝的程序教程的教学视频下got到了一整套流程,特意写贴,以作备份。

动态链接库的创立

在头文件和源文件新建.h和.cpp文件,用来写主要函数。

在Q.h中加入如下代码:

#pragma once#ifdef BUILD_MYDLL
#define API_SYMBOL __declspec(dllexport)
#else
#define API_SYMBOL __declspec(dllimport)
#endifextern"C" API_SYMBOL int convert_array (int* data, int len);

在Q.cpp中加入如下代码:

#include"StdAfx.h"
#define BUILD_MYDLL
#include"Q.h"
#include<iostream>
using namespace std;int convert_array(int* data ,int len){for (int i=0;i<len ;i++){cout<<data[i]<<",";}cout << endl;int nTotal = 0;for (int i=0;i<len;i++){nTotal+=data[i];--data[i];}
return nTotal;
}

点击调试,出现如下输出则代表创建成功:

其中Example.dll和Example.lib在根目录\MYDL\Debug中,如果别人想调用动态链接库,把dll、lib、头文件和怎么输入输出给别人就行,。下面介绍如何自己调用,方便调试。

含蓄的(隐式)调用动态链接库

称为含蓄的(隐式)调用动态链接库是因为项目需要将.dll和.lib文件在属性中提前配置。首先在解决方案里新建CLR控制台应用程序

将implicit.cpp中的代码全部换成:

// demoinvokeDLL.cpp: 主项目文件。
#include "stdafx.h"
#include<iostream>
#include"Q.h"
using namespace std;int main()
{int arr[]={3,6,7,8};int nLen=sizeof(arr)/sizeof(int);int nTotal=convert_array(arr,nLen);cout <<"数组元素求和结果:"<< nTotal<<endl;cout<<"数组元素新值:"<<endl;for (int i=0;i<nLen;i++){cout<<arr[i]<<",";}system("pause");
}

接下来开始在属性中配置环境:

  1. 读取.h


右键项目进入属性,在“附加包含目录”中添加动态库的目录。

  1. 读取.lib和.dll



开始调试,以下为正确结果:

粗暴的(显式)调用动态链接库

称为含蓄的(隐式)调用动态链接库是因为不需要配置环境,直接暴力读取。首先新建项目:

将violent.cpp里代码全部复制成:

// xsinvokeDll.cpp: 主项目文件。
#include"stdafx.h"
#include<iostream>
#include<Windows.h>using namespace std;
typedef int (*LPDO_ARRAY) (int *pArr,int nLen);int main(){HINSTANCE hDll;//定义一个实例句柄,引用动态库LPDO_ARRAY lpDo_array;//定义一个函数指针,用来指向导出函数//第二步,加载DemoDll.dll动态库文件hDll = LoadLibrary(L"Example.dll");if (hDll!=NULL){//第三步,获取dll中的函数地址lpDo_array=(LPDO_ARRAY)GetProcAddress(hDll,"convert_array");if(lpDo_array!=NULL){//第四步 调用函数int nArr[]={1,2,4,6};int nLen=sizeof(nArr)/sizeof(int);int nRet;//通过函数指针lpDo_array调用函数nRet = lpDo_array(nArr,nLen);cout<<"返回值:"<<nRet<<endl;cout<<"数组新值:";for (int i= 0 ; i<nLen;++i){cout<<nArr[i]<<",";}        }//第五步,释放动态库句柄FreeLibrary(hDll);}system("pause");
}

开始调试,调试结果为:

尾言

都是工程运用,不需要多解释有的没的,怎么快怎么来。饭喂嘴里也要自己嚼过才能咽下去。感谢b站up主“老蓝的程序教程”的教学视频!

C++ 动态链接库快速创立和两种调用方式相关推荐

  1. PyQt5随笔:Qtdesigner设计转换而来的界面.py文件两种调用方式

    PyQt5随笔:Qtdesigner设计转换而来的界面.py文件两种调用方式 文章目录 PyQt5随笔:Qtdesigner设计转换而来的界面.py文件两种调用方式 1.前言 2.方式一:另建 py ...

  2. 函数指针的两种调用方式

    void test(int); int main(void){void (*fp)(int);fp=test;(*fp)(9); fp(9);return 0; } void test(int a) ...

  3. JavaScript实现二级、多级(N级)联动下拉列表框更新版,支持IE6,FireFox,函数和类两种调用方式,支持到N级,非常通用。

    自己花了不少时间整理.编写的东东.本来有点舍不得放出来.放出来了也就不加任何版权什么XX的了,省得有人删除麻烦:D 特点:通用性强.实现了script和html分离 废话少说.文档就不给了.想研究代码 ...

  4. 类中方法的两种调用方式

    class Foo(object):def func(self, name):print(name)# 第一种,通过实例对象调用func方法 foo = Foo() foo.func('allin') ...

  5. (一)Service的生命周期和两种启动方式

    Service 一.概念 Service,也是Android四大组件之一.对照Activity的概念,Service属于后台运行的进程,并不需要界面,可以在后台长期运行,适合做比如播放音乐,下载等任务 ...

  6. 完全理解乘法快速幂及其两种写法的解析

    an=?0≤n≤10105an=?0≤n≤10105 a^n=? \qquad 0 \le n \le 10^{10^5} 没错,乘法快速幂就是解决上述问题的. 乘法快速幂的思想 可以看到,要求一个数 ...

  7. golang java rpc_golang两种调用rpc的方法

    本文实例讲述了golang两种调用rpc的方法.分享给大家供大家参考,具体如下: golang的rpc有两种方法进行调用,一种是rpc例子中给的: package main import ( &quo ...

  8. win8.1系统快速关机的两种方法

    win8.1系统快速关机的两种方法 前几天刚刚重装了一遍系统,觉得以前的win8.1的系统用起来还挺顺手的,这次也就装8.1的吧,装完后一切都好,但是晚上关机的时候发现一点跟我上次系统不一样的地方,就 ...

  9. 【Django】项目中调用深度学习模型model.predict()(Django两种启动方式runserver和uwsgi的区别)

    目录 问题 测试 解决方法 Django两种启动方式runserver和uwsgi的区别 问题 部署含有深度学习模型的Django项目的uWSGI.Nginx服务器的时候,所有模块都可以正常运行,也可 ...

最新文章

  1. asp.net图片浏览器效果
  2. 如何:重写 ToString 方法(C# 编程指南)
  3. Java11正式发布了,我们该怎么办?
  4. 网转 mm IOS 报表
  5. 全网最详细的Sentinel安装教程,没有之一!谁反对?(Linux+windows)
  6. Angular 内容投影出现 No provider for TemplateRef found 错误的单步调试
  7. nginx 在阿里云怎么安装mysql_在阿里云 CentOS 服务器(ECS)上搭建 nginx + mysql + php-fpm 环境...
  8. JSK-18 跳跃游戏【基础】
  9. CrtmpServer 接收推送视频流 注册流基本流程
  10. Linux ls按时间排列
  11. 基于Java Swing的进销存管理系统
  12. 开发“小米商城官网首页”(静态页面)
  13. 阿里云免费证书SSL下载及安装
  14. 如何成为一个优秀的测试工程师
  15. #define 喵 int_【吃鸡大作战第三季】第12集 告白小雪喵
  16. android 分屏切换流程,一种切换分屏模式和多窗口模式的方法与流程
  17. Knowledge Graph Embedding: A Survey of Approaches and Applications【翻译】
  18. 计算机桌面怎么换服,台式电脑怎么换桌面壁纸
  19. 连接数据库出现java.lang.NullPointerException
  20. c++实现贪心法构造最大整数问题

热门文章

  1. bzoj1599: [Usaco2008 Oct]笨重的石子
  2. (转)2018pycharm破解
  3. PKI-CA数字证书验证过程
  4. 茗创:脑电数据处理业务
  5. Rancid cvs ViewVC 安装配置
  6. 超论价值观,需求价值论
  7. 增长奥秘:滴滴当年如何挖掘最有效的渠道和增长方法?
  8. 我的京东管理生涯随想 1
  9. android 外接触摸板,Intel推出远程键盘APP:Android手机可作为键盘和触摸板远程控制PC...
  10. 如何优雅地实现C++编译期多态?