C++笔记-DLL的编写与调用
目录
基本概念
代码与实例
基本概念
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的编写与调用相关推荐
- Delphi中高级DLL的编写和调用
根据Delphi提供的有关 DLL编写和调用的帮助信息,你可以很快完成一般的 DLL编写和调用的 应用程序.本文介绍的主题是如何编写和调用能够传递各种参数(包括对象实例)的 DLL.例 ...
- 【开发者笔记】java 利用jna调用c#的dll
一.需求阐述: 如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑用java来调用现成的c#dll实现需 ...
- 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 提 供 者: 普云 ...
- 视频教程-PHP扩展模块开发之DLL编写与调用-PHP
PHP扩展模块开发之DLL编写与调用 云知梦创始人,国际架构师,11年互联网培训和开发经验,曾在港电讯盈科.北大青鸟集团.远大教育.北京易第优教育等公司任职曾获得美国红帽RHCA构架师和RHCDS数据 ...
- DLL的生成、编写、调用总结
一. DLL的创建 1. 创建环境 VS2022(注:其他VS大同小异) 2. 创建过程 新建My_Dll项目 点击确定 ->下一步->输入DLL工程的名称My_Dll->创建. 3 ...
- c++创建包含opencv的dll供C,C#调用
最近做项目,需要将C++算法封装成dll,给C#调用,之前没接触过C#,现学一波,只做了dll并用C#测试了下,运行成功.记录下来过程,供大家参考. 编程环境:VS2013+opencv2.4.13 ...
- 动态库的编写和调用 - Delphi
uDll.pas function Add10(ANum: integer): integer; stdcall; //Delphi 默认采用 register 调用约定,如果dll涉及跨语言调用 ...
- 动态链接库的编写与调用
动态链接库是编绎好的二进制文件与exe文件类似,但它不能单独运行.它是一个独立的模块,也包含了代码.数据或资源,能被其它程序共享.多个程序调用动态链接库里的同一个函数时,理论上该函数在内存中只存在一份 ...
- VS2019 - 动态库的编写和调用
VS2019 - 动态库的编写和调用 完善自己知识体系的一些内容: 用C++编写的DLL(动态链接库)中,导出类的接口封装方法总结 详解dll的封装,以及三种调用方法(将±×÷封装为例) 1 VS20 ...
最新文章
- reg类型变量综合电路_verilog中reg和wire类型的区别
- 脆弱的Scrum,敏捷在哪里?
- 使用jQuery Ajax功能的时候需要注意的一个问题
- linux手动同步文件命令,Linux文件同步命令rsync详解
- Object.observe将不加入到ES7
- pom添加mysql依赖tomcat崩溃_Spring Boot + Mybatis + Spring MVC环境配置(一) :Spring Boot初始化,依赖添加...
- Java常用设计模式————原型模式(二)之深拷贝与浅拷贝
- simulink 分析达芬方程
- html表格展开明细,展开/折叠HTML表格
- 使用WebService与Oracle EBS进行集成(下)
- html表格怎么改圆角边框,Table元素设置圆角border
- [leetcode]Symmetric Tree
- BABOK - BA计划和监控(BA Planning Monitoring)概要
- 微软威胁情报中心总经理 John Lambert 谈安全
- 5G 与 WIFI6 的对比
- 超声波模块工作原理分析及程序
- 西方文化系列讲座之罗马、基督教文化
- 移动硬盘坏了数据可以恢复吗 移动硬盘坏了怎么导出数据
- 微信公众号访问本地服务器的方法
- Linux:生成core的几种方式