21.5 windows_21_Library_use_DLL_Invoke 动态库补充5
// windows_21_Library_use_DLL_Invoke.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
//2.2.2 定义函数指针,在开发工程中,一般都是大写
typedef int( *DLL_ADD )( int nAdd1, int nAdd2 );
typedef int( *DLL_SUB )( int nSub1, int nSub2 );
typedef int( *DLL_MUL )( int nMul1, int nMul2 );
void UseDll( )
{
//2.2.1 加载动态库,使用LoadLibrary,HMODULE = HINSTANCE
HMODULE hDll = (HMODULE)LoadLibrary( "windows_21_Library_DLL_test.dll" );
if (hDll == NULL)
{
printf( "Load Failed\n" );
return;
}
printf( "hDll handle: %p\n", hDll );
//2.2.2 定义函数指针变量
DLL_ADD Dll_Add = NULL;
DLL_SUB Dll_Sub = NULL;
DLL_MUL Dll_Mul = NULL;
//2.2.3 获取函数地址 GetProcAddress
Dll_Add = (DLL_ADD)GetProcAddress( hDll, "Dll_Add" ); //取得Dll_Add函数地址转换成DLL_ADD类型
printf( "Dll_Add handle: %p\n", Dll_Add );
Dll_Sub = (DLL_SUB)GetProcAddress( hDll, "Dll_Sub" );
printf( "Dll_Sub handle: %p\n", Dll_Sub );
Dll_Mul = (DLL_MUL)GetProcAddress( hDll, "Dll_Mul" );
printf( "Dll_Mul handle: %p\n", Dll_Mul );
if (!(Dll_Add && Dll_Sub && Dll_Mul))
{
printf( "Get function failed\n" );
}
//2.2.4 使用函数
//由于 Dll_Add函数DLL文件里使用的是CPP方式导出,无法得到正确的函数名,所以在这里无法使用
int nSub = Dll_Sub( 100, 100 );
int nMul = Dll_Mul( 100, 100 );
printf( "nSub:%d\n", nSub );
printf( "nMul:%d\n", nMul );
//2.2.5 释放动态库,看样子有加载就有释放的预言就又实现了
FreeLibrary( hDll );
}
int _tmain(int argc, _TCHAR* argv[])
{
UseDll( );
return 0;
}
转载于:https://www.cnblogs.com/nfking/p/5573302.html
21.5 windows_21_Library_use_DLL_Invoke 动态库补充5相关推荐
- 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用
上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...
- 第十天2017/04/21(1、函数指针、❤动态库回调❤)
1.函数指针的语法基础 [函数指针的定义.初始化.使用]对函数名去多少个&,都不起作用,都是一样的,都还是它本身test.如:test.&test.&&test.&am ...
- Linux学习笔记-生成动态库(补充说明)
1.在Makefile中创建动态库. 2.在动态库中共享class类型. Makefile文件如下: EXE=libexample.so SUBDIR=srcCXX_SOURCES=$(foreach ...
- linux代码动态分析软件,举例分析Linux动态库和静态库
函数库分为静态库和动态库两种.创建Linux静态库和Linux动态库和使用它们在这里将以举例的形式详述一下.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不 ...
- libevent 实现的socket 通信 server以及解决找不到动态库的方法
注: client 个人觉得没必要用 libvent来实现就没写 注:由于 涉及到回调函数的使用 如有疑惑的可以先去了解回调函数的实现机理 先来说一下 libevent主要是干啥的 : 内部封装了 s ...
- automake生成静态库文件_动手 | 奶奶级的动态库入门
程序编译过程 库文件 静态链接和动态链接的区别? 从0开始 - 创建和使用静态链接库 创建静态库项目 向静态库中添加文件 编译静态库 创建引用静态库的C++控制台应用 在应用中使用静态库功能 从0开始 ...
- ViSP安装之Windows系统基于VS2019编译器编译获得VISP动态库
Windows系统基于VS2019编译器编译获得VISP动态库 官网地址: Installation from source for Windows with Visual C++ 2019 (vc1 ...
- linux动态链接库的使用,Linux动态库soname的使用
通过一个简单的例子,体验一下Linux动态库soname的使用. 假设有一个动态库:libbar.so.1.1.0,其对应的三个名称如下. realname:libbar.so.1.1.0 sonam ...
- python调用c++动态库 linux_linux中使用boost.python调用c++动态库的方法
前言 最近开始使用 robot framework 测试c++的动态库,robot framework 是跑在 windows 上面,c++动态库是跑在远程linux主机上面.测试办法是让 robot ...
最新文章
- 马维英坐镇,共话AI赋能生命健康与生物医药
- 基于 MongoDB 的 python 日志功能
- 【示例】C语言中利用数组存放函数指针
- maven 的安装配置 和编译java程序
- Linux Shell 通配符、元字符、转义符使用实例介绍
- 每天一道LeetCode-----判断一个数是否是happy number(每一位的平方和最终为1)
- Linux操作系统笔记——Shell变量
- matlab画图设置
- 懂得一些基本常识,就不会被《非酒精類致命飲料》或者叫做《我一辈子都不再喝可口可乐》的这篇文章所蒙蔽...
- 计算机无故重启是什么原因,事实:无缘无故重新启动计算机有什么问题?计算机无故重启的原因和解决方法...
- SOME/IP报文格式-Message ID
- 一份走心的iOS开发规范
- 导航标签html,导航标签
- windows下nginx常见问题记录
- 部门来了一位前阿里的大神…
- 简述计算机视觉在各领域中的成功应用,计算机视觉技术在茶叶领域中的应用现状及展望...
- 昌乐一中2021年高考成绩查询,喜 报
- 数据库 用Python把数据写入到MySQL数据库/如何使用Python将数据写入到阿里云的RDS-MYSQL
- GHOST 安装系统教程
- git reset后本地拉取_【转】【Mac + Git】之Git pull 强制拉取并覆盖本地代码
热门文章
- gcc编译器_2020好用的C++编译器有哪些?这几款值得下载
- js全局变量和局部变量名称一样_微信小程序的全局变量、页面变量,你真的掌握了?...
- 如何让cloudflare缓存html,wordpress博客使用CloudFlare的页面规则缓存设置教程
- C++socket编程(五):5.2 tcp编程总结
- c语言从源代码到可执行,从源代码到可执行文件
- mysql记录当前表数据的数据条数据类型_MySQL学习记录:数据类型与操作数据表...
- SpringBoot POM 继承(spring-boot-starter-parent)
- apscheduler 任务管理
- c++ 友元函数,友元类
- flask-Blueprint