c++dll生成和调用
转载:http://hi.baidu.com/new_day2009/blog/item/51e0c6ec1cd05adbb21cb16d.html
生成Dll文件
新建项目,选择Win32项目,工程名:09DllDemo 确定后,选择应用程序设置, 应用程序类型选择DLL(D),附加选项上选择 导出符号(X)(便于学习)。单击完成,完成工程创建。
-----------------------------------------------------------------------------------------------------------------
打开 09DllDemo.cpp文件,因为选择导出符号的缘故,VC++自动给我们生成了
// 这是导出函数的一个示例。
extern "C"
{
// 这是导出函数的一个示例。
MY09DLLDEMO_API int fnMy09DllDemo()
{
return 42;
}
}
打开 09DllDemo.h 我们可以看到声明的函数。
//声明要导出的函数
extern "C"
{
MY09DLLDEMO_API int fnMy09DllDemo();
}
---------------------------------------------------------------------------------------------------------------------
我们自己要添加入的函数按上述格式添加就可以了。(加extern "C"能保证导出的Dll函数名不会变化。这里的描述可能有点问题)
选中项目,点生成,生成Dll文件的任务就完成了。最后09DllDemo工程产生的文件中有3个可以被其他工程所使用:09DllDemo.h 09DllDemo.dll 09DllDemo.lib。
.dll文件就是动态链接库,.lib是供程序开发用的导入库,.h文件包含了导出函数的声明。
调用Dll文件
调用Dll中的导出函数有两种方法:
1.装载期间动态加载。
模块可像调用本地函数一样调用从其他模板导出的函数(API函数就是这样调用的)。装载期间链结必须使用DLL的导入库(.lib)文件,它为系统提供了加载这个Dll和定位Dll中的导出函数所需的信息。
应用程序启动时由载入器(加载应用程序的组件)载入09DllDemo.dll文件。载入器如何知道要载入哪些Dll呢?这些信息记录在执行文件(PE文件)的idata节中。使用这种方法不用自己写代码显式加载DLL。
---------------------------
新建一个09ImportDemo的Win32控制台工程,将09DllDemo.h,09DllDemo.lib,09DllDemo.dll 3个文件拷贝到09ImportDemo目录下。
下面给出了调用导出函数fnMy09DllDemo的代码
#include "09DllDemo.h"
#include <iostream>
using namespace std;
#pragma comment(lib,"09DllDemo")
void main()
{
int a =fnMy09DllDemo();
cout<<a<<endl;
}
发布软件时必须将该软件使用的Dll与主程序一起发布。09ImportDemo.exe和09DllDemo.dll放在同一个目录下。载入器加载Dll文件时,默认情况是在应用程序的当前目录下查找,如果找不到就到系统盘"\windows\system32"文件夹下查找,还找不到就按错误处理。
--------------------------------------------------------------------------------------------------------------
2.运行期间动态加载。(只需Dll文件即可)
运行期间动态加载是在程序运行过程中显式得加载Dll库,从中导出需要的函数。
为了能够在运行期间动态导出函数,一般需要在09DllDemo工程中建立一个DEF文件来指定要导出的函数。
----添加DEF文件
打开09DllDemo工程,右键点击工程,选择添加,选择TextFile选项,输入文件名DllDemo.def
新的DllDemo.def中添加如果内容
=============================
EXPORTS
fnMy09DllDemo
=============================
重新生成下就完成了。
回到09ImportDemo工程,将程序修改为
------------------------------------------------------------------------------------------
#include <windows.h>
#include <iostream>
using namespace std;
//定义FunctionFunc为指向一个返回值为int型 无参数的函数的指针
typedef int (*FunctionFunc)();
int main()
{
FunctionFunc _FunctionFunc;
//加载目标Dll
HMODULE hModule = ::LoadLibrary(TEXT("D:\\09DllDemo.dll"));
if (hModule==NULL)//如果Dll加载失败,释放它占用的资源
{
::FreeLibrary(hModule);
}
//取得目标Dll中导出函数的地址(提醒:函数名就是函数的入口地址)
_FunctionFunc=(FunctionFunc)::GetProcAddress(hModule,"fnMy09DllDemo");
if (_FunctionFunc==NULL)
{
::FreeLibrary(hModule);
}
int a =_FunctionFunc();
cout<< a<<endl;
::FreeLibrary(hModule);
cin.get();
return 1;
}
------------------------------------------------------------------------------------------
c#中调用Dll
[DllImport("D:\\09DllDemo.dll")")]
public static extern int fnMy09DllDemo();
------------------------------------------------------------------------------------------
备注:
在没加extern "C"生成的Dll的函数名会有变化,因此在运行期间动态链结过程中,调用GetProcAddress会返回空值。
如不能修改Dll源码,可采用下面的方式解决(比较笨的方法,有好的请留言,谢谢):先用Depends.Exe(VS自带的工具)打开Dll文件,右键点击函数复制函数名。如获得的函数名为
?fnMy09DllDemo@@YAHXZ
C++中 直接
_FunctionFunc=(FunctionFunc)::GetProcAddress(hModule,?fnMy09DllDemo@@YAHXZ);
c#中
[DllImport("D:\\09DllDemo.dll", EntryPoint = "?fnMy09DllDemo@@YAHXZ")]
public static extern int fnMy09DllDemo();
c++dll生成和调用相关推荐
- DLL生成与调用总结
最近因项目需要将一部分代码封装成DLL供其他程序调用,在这个过程中遇到一些困难,现将过程总结出来,供以后参考. 一.生成DLL 生成DLL比较简单,既可以直接新建一个DLL项目: 也可先新建一个空项目 ...
- C++动态库dll生成及调用总结
本文主要总结将类生成dll并且调用中遇到的坑和操作.平时打包成一个类的好处在于内部可以有多个成员函数供以调用,且成员变量也可以共用.如果平时想用到多个函数打包成的dll,那一个个封装会很繁琐,且多个函 ...
- C++中.lib静态库、.dll动态库的生成及调用2
关于动.静态库的介绍及静态库的生成及调用参见:C++中.lib静态库..dll动态库的生成及调用<1>,本文主要介绍基于VS2015平台的动态库dll的生成及调用方法. 一.动态库的生成 ...
- C++中.lib静态库、.dll动态库的生成及调用1
一.前言 1.动态链接库(dll)与静态链接库(lib): 动态链接库(dll)是一个可以被其他应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源.在链接步骤中,连接器将从库文件取得所需的代 ...
- 最简单C++生成dll 给C#调用的方法
利用C++创建DLL并C#调用 环境:window 10,VS2015 community 一.利用C++创建DLL 1.新建项目: 2.打开CreateDLL.cpp文件,并输入测试代码 新建cpp ...
- 基于GUI的mcc编译和dll生成
基于GUI的mcc编译和dll生成 1.mcc的编译 1.1 MCRInstaller编译器的安装 找到Matlab下的MCRInstaller,双击MCRInstaller编译器,运行安装. 1.2 ...
- C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码
本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码.网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边 ...
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
from:http://m.blog.csdn.net/article/details?id=51075023 在VS2015中先创建C#项目,然后再创建要编写的动态库DLL项目,这样做的好处是整个解 ...
- C/C++ DLL封装及调用
目录 操作步骤 1. 创建dll 2. 创建测试程序 需求:C开发的控制台程序封装为dll,用于C++程序调用 开发环境:VS 2013 Pro 操作步骤 1. 创建dll 新建工程:C/C++ -& ...
最新文章
- python面向对象小练习
- 用神经网络的分类行为理解质量到底是什么?
- Windows API一日一练(86)GetClipboardData函数
- rsync 配置详解
- libsvm java下载_一个基于LIBSVM(JAVA)的股票预测demo
- 5年财务老员工:早发现这个报表工具,也不会因为加班凄凉辞职
- 联合 5 位大佬送 210 本实体书,包邮到家!
- Dreamweaver快捷键
- Java获取图片传到前端,生成二维码给前端
- 放大电路不同频段耦合电容、旁路电容、极间电容和分布电容的分析方法
- 【大学课程自学网站】
- 如何防止网站被黑客入侵,避免网站被黑的防御方法
- 海量GIS文章,软件教程,GIs编程奉送!!(转)
- list()与tolist()的区别
- php 获取qq头像,php只需要一个QQ号就可以获得用户信息(昵称、头像)
- 优酷土豆路由宝刷固件改无线打印服务器笔记
- 用Python+Moviepy+OpenCV制作灯光秀短视频
- 华旭金卡js调用身份证阅读器和易联众社保卡阅读器
- 有关多项式处理的各种算法总结
- AWK 将文本按行打乱顺序
热门文章
- 三、入门爬虫,爬取豆瓣电影
- 非科班通过几个月的培训入行人工智能现实吗?
- CVPR 2022 | GeoTransformer:基于Transformer的点云配准网络
- 全网首个OpenPrompt尝鲜报告:Prompt研究者必备实验利器
- ​你真正了解使用过的数据集吗?数据集有什么关系?数据集之间有多像?
- 岗位内推 | 微软亚洲研究院智能多媒体组招聘实习生
- CVPR 2021 | 基于跨任务场景结构知识迁移的单张深度图像超分辨率方法
- html页面右侧滚动,HTML5页面点击和左右滑动页面滚动
- 大学python教材实验七字典与集合答案_2018-08-28 day7 python基础 字典和集合(含作业)...
- 【虚拟化】Linux中安装配置Docker