目录

基本概念

代码与实例


基本概念

Visual Studio的编译环境下,DLL分为3类:

非MFC的DLL,使用SDK API进行编程,能被所有语言调用。

MFC规则DLL,可以使用MFC进行编程,能被其他语言调用。

MFC扩展DLL,可以使用MFC进行编程,但只能被MFC编写的程序调用。

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{..................
}

hMoulde:指向dll实例的句柄;

ul_reason_for_call:指明dll被调用的原因

LPVOID:保留,不使用。

内部为:

{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}

DLL_PROCESS_ATTACH:当进程第一次链接DLL并通过它的入口点时,会得到这个参数。

DLL_PROCESS_DETACH:进程在空间内取消DLL映射时,得到这个参数。

DLL_THREAD_ATTACH:每当新线程创建时,系统会对所有映射的DLL传入此参数调用入口函数。

DLL_THREAD_DETACH:每当线程退出或返回时,系统会对所有映射的DLL传此参数要求执行对应清理工作。

进程调用DLL的过程:

使用LoadLibrary加载需要的dll,

使用GetProcAddress获取函数入口

然后就可以调用了!

代码与实例

dll关键代码如下:

.h文件:

#pragma once#include "stdafx.h"#define ExportFunc _declspec(dllexport)
extern "C" ExportFunc int Add(int a, int b);
extern "C" ExportFunc int Sub(int a, int b);

.cpp文件

#include "stdafx.h"
#include "ExportDLL.h"int Add(int a, int b){return a + b;
}int Sub(int a, int b){return a - b;
}

调用采用mfc:

typedef int(*ADD)(int a, int b);
typedef int(*SUB)(int a, int b);void CInjecterDemoDlg::OnBnClickedButton1()
{HMODULE hModule = LoadLibraryW(_T("E:\\vs2012\\DllTest\\Debug\\DllTest.dll"));if(!hModule){return;}ADD Add;SUB Sub;Add = (ADD)GetProcAddress(hModule, "Add");Sub = (SUB)GetProcAddress(hModule, "Sub");if(!Add || !Sub){return;}int Result;Result = 0;Result = Add(10, 5);CString result;result.Format(_T("%d"), Result);MessageBox(result);Result = Sub(10, 5);result.Format(_T("%d"), Result);MessageBox(result);FreeLibrary(hModule);
}

项目下载地址:

https://github.com/fengfanchen/CAndCPP/tree/master/DllTest

C++笔记-DLL的编写与调用相关推荐

  1. Delphi中高级DLL的编写和调用

            根据Delphi提供的有关 DLL编写和调用的帮助信息,你可以很快完成一般的 DLL编写和调用的 应用程序.本文介绍的主题是如何编写和调用能够传递各种参数(包括对象实例)的 DLL.例 ...

  2. 【开发者笔记】java 利用jna调用c#的dll

    一.需求阐述: 如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑用java来调用现成的c#dll实现需 ...

  3. jni 从c传递map到java_java_jni 本地调用接口DLL的编写样本,涉及数组传递,相关的 和C程序均已包括。 Develop 256万源代码下载- www.pudn.com...

    文件名称: java_jni下载  收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 8055 KB 上传时间: 2016-04-16 下载次数: 0 提 供 者: 普云 ...

  4. 视频教程-PHP扩展模块开发之DLL编写与调用-PHP

    PHP扩展模块开发之DLL编写与调用 云知梦创始人,国际架构师,11年互联网培训和开发经验,曾在港电讯盈科.北大青鸟集团.远大教育.北京易第优教育等公司任职曾获得美国红帽RHCA构架师和RHCDS数据 ...

  5. DLL的生成、编写、调用总结

    一. DLL的创建 1. 创建环境 VS2022(注:其他VS大同小异) 2. 创建过程 新建My_Dll项目 点击确定 ->下一步->输入DLL工程的名称My_Dll->创建. 3 ...

  6. c++创建包含opencv的dll供C,C#调用

    最近做项目,需要将C++算法封装成dll,给C#调用,之前没接触过C#,现学一波,只做了dll并用C#测试了下,运行成功.记录下来过程,供大家参考. 编程环境:VS2013+opencv2.4.13 ...

  7. 动态库的编写和调用 - Delphi

    uDll.pas   function Add10(ANum: integer): integer; stdcall; //Delphi 默认采用 register 调用约定,如果dll涉及跨语言调用 ...

  8. 动态链接库的编写与调用

    动态链接库是编绎好的二进制文件与exe文件类似,但它不能单独运行.它是一个独立的模块,也包含了代码.数据或资源,能被其它程序共享.多个程序调用动态链接库里的同一个函数时,理论上该函数在内存中只存在一份 ...

  9. VS2019 - 动态库的编写和调用

    VS2019 - 动态库的编写和调用 完善自己知识体系的一些内容: 用C++编写的DLL(动态链接库)中,导出类的接口封装方法总结 详解dll的封装,以及三种调用方法(将±×÷封装为例) 1 VS20 ...

最新文章

  1. reg类型变量综合电路_verilog中reg和wire类型的区别
  2. 脆弱的Scrum,敏捷在哪里?
  3. 使用jQuery Ajax功能的时候需要注意的一个问题
  4. linux手动同步文件命令,Linux文件同步命令rsync详解
  5. Object.observe将不加入到ES7
  6. pom添加mysql依赖tomcat崩溃_Spring Boot + Mybatis + Spring MVC环境配置(一) :Spring Boot初始化,依赖添加...
  7. Java常用设计模式————原型模式(二)之深拷贝与浅拷贝
  8. simulink 分析达芬方程
  9. html表格展开明细,展开/折叠HTML表格
  10. 使用WebService与Oracle EBS进行集成(下)
  11. html表格怎么改圆角边框,Table元素设置圆角border
  12. [leetcode]Symmetric Tree
  13. BABOK - BA计划和监控(BA Planning Monitoring)概要
  14. 微软威胁情报中心总经理 John Lambert 谈安全
  15. 5G 与 WIFI6 的对比
  16. 超声波模块工作原理分析及程序
  17. 西方文化系列讲座之罗马、基督教文化
  18. 移动硬盘坏了数据可以恢复吗 移动硬盘坏了怎么导出数据
  19. 微信公众号访问本地服务器的方法
  20. Linux:生成core的几种方式

热门文章

  1. 你必须要知道的架构知识~第二章 代码是否面向对象,要看你的继承怎么用
  2. ×××网络连接安全性以及协议支持介绍
  3. 10个强大实用数据地图,不懂代码也能做!(附demo)
  4. 成就优秀程序员的很多因素你知道多少?
  5. 携反省一起上路的FreeEIM
  6. 获得磁盘的飞鸽传书描述信息
  7. C++ 中重载 + 操作符的正确方法
  8. 手把手教你搭建自己的个人博客(图文教程)
  9. 下班啦!做那么多老板不会心疼你的
  10. 拼装机器人感想_机器人心得体会(20190510062147)