如何正确创建DLL和使用DLL

如何正确创建DLL和使用DLL


本文将通过一个简单的实例来说明,如何正确的导出DLL中的类、对象、函数,并如何通过静态加载或动态加载的方式来使用DLL。

一、DLL中导出类、函数、对象

1. 创建一个空的Win32 Dynamic-Link Library项目Test

2. 在项目中添加一个Test.h头文件,该文件的内容如下:

//导出类
class __declspec(dllexport) CTest
{
...
}
;

//导出函数
__declspec(dllexport) void FuncTest();


//导出对象
extern __declspec(dllexport) CTest  ObjTest;

这段代码中通过__declspec(dllexport)导出了类CTest、函数FuncTest和对象ObjTest。在.cpp文件中实现上面的声明与类的定义后,经编译就可以生成一个.dll和.lib文件了。

二、静态加载DLL

1. 新建一个Win32 项目。

2. 将上面编译生成的.lib文件复制到,该项目下。

3. 在项目中添加一个Test.h(通过该文件实现对DLL的静态加载),该.h文件的内容主要是从DLL的.h文件中复制过来。具体内容如下:

#pragma comment(lib, "test.lib")

//导入类
class __declspec(dllimport) CTest
...
{
...
}
;

//导入函数
__declspec(dllimport) void FuncTest();


//导入对象
extern __declspec(dllimport) CTest  ObjTest;

这个.h文件与dll的.h的不同就是,在开头加了#pragma comment(lib, "test.lib"),以及类、函数、对象前面的__declspec(dllexport)变成了__declspec(dllimport) 。通过这些修改就可以告诉编译器,这个.h文件中定义的类、声明的函数和对象 都是从test.dll中导入的。在项目中完成对这些类、函数、对象的调用代码后,就可以将其编译成可执行文件。将生成的可执行为文件、以及上面生成的.dll文件复制到同一个文件夹中就可以正常运行这个可执行文件。

三、动态加载DLL

如果上面的DLL需要被动态调用,这需在DLL的代码中添加一个 .def文件,在该文件中指出哪些被导出的函数和对象是可以动态调用的。根据上面的例子.def文件的内容如下:

LIBRARY    TestImp

EXPORTS
    ObjTest
        FuncTest

在完成.def文件后,重新编译dll。重新编译dll后就可以对该Dll进行动态调用了,调用过程的代码如下:

typedef void (*HFUNC)()

HINSTANCE hDLL 
= LoadLibrary("Test.dll");             //加载DLL

if(hDLL)
{
           HFUNC hFun 
= (HFUNC)GetProcAddress(hDLL, "FuncTest");       //获得Dll中FuncTest函数的指针。

          
if (hFun)
                 hFun();    
//执行函数FuncTest
            else
                   ...            
//没有找到函数FuncTest
}

else
{
//加载失败
}

 上面的代码实现的对DLL中函数的动态调用,在代码中通过LoadLibrary将DLL加载到内存中,然后GetProcAddress获得指定函数所在的内存地址(即该函数的函数指针),获得指向这个函数的指针后就可以对它进行调用了。

对于DLL中对象的动态调用过程基本上是一样的,先将DLL加载到内存,然后通过GetProcAddress获得对象所在的地址。

 从上面可以看出,DLL的动态调用过程就是将DLL加载到内存,然后通过GetProcAddress获得DLL中指定对象或函数在该内存中的地 址,通过该地址就可以对函数或对象进行调用。由于在C++中没有类的对象,也没有类指针一说,所以是无法动态使用DLL中的类的(如果谁知道如何使用可以 告诉我)。

转载于:https://www.cnblogs.com/fence/archive/2010/05/27/1745019.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言求35 45的最大公约数,C语言怎么求最大公约数和最小公倍数

#3段梦超2009-12-20 21:31输入两个正整数m和n, 求其最大公约数和最小公倍数. <1> 用辗转相除法求最大公约数 算法描述: m对n求余为a, 若a不等于0 则 m 最小公倍数 两个数的积 / 最大公约数#include int main(){int m, n; int m_cup, n_cup, res; /*被除数, 除数, 余数*/…

mysql-5.7.11-winx64.zip 安装配置

1、下载 http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.11-winx64.zip 2.解压缩zip包&#xff1b; D:\Program Files\mysql-5.7.11-winx64 3.配置环境变量&#xff0c; 3.1 添加path路径&#xff0c; D:\Program Files\mysql-5.7.11-winx64\bin 3.2.修改mysql-default.…

64位centOS5.4系统安装memcached

1.先下载相关资源libevent 和 memcached&#xff1b; #cd /temp #wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz #wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz 2.判断系统是否已经安装了libevent #rpm -qa | g…

python用语句输入一个3*3的二维矩阵_python中二维数组的建立,输入和输出

for循环&#xff1a; for i in range(x,y,dir): pass 首先这个区间是左闭右开 其次dir在省略的情况下默认为1&#xff0c;就是每次加一&#xff0c;也可以指定 python的数组&#xff1a; python中是没有数组的&#xff0c;但是可以用list来代替数组 一维数组&#xff1a; 方法一…

【分享】LazyLoad延迟加载(按需加载)

1&#xff1a;实际需求 大型网站往往很矛盾&#xff0c;想用户在首页看到更多东西&#xff0c;又不想浪费太多服务器流量。比如一个有3屏的首页。可能50%的用户进首页的目的是点击首页的连接&#xff0c;到子页面。 那么我们的网站却为100%的用户加载了 3个 屏幕的所有内容。如…

python中ipo模型有_python ipo模型是指什么?_后端开发

c语言中如何用do...while语句求1到100的累加和_后端开发 c语言中用do...while语句求1到100的累加和的方法是&#xff1a;1、首先定义变量i与sum&#xff0c;如【int sum0,i1】&#xff1b;2、然后用do...while语句实现即可&#xff0c;如【do{sumsumi;i;}while(i<100)】。py…

Storm 疑难杂症。

疑难解答&#xff1a;这个页面列出了一些人们在使用storm时遇到的问题和他们的解决方案。worker 进程 启动时没有堆栈信息。可能的情形&#xff1a;Topology 只在一台机器的不同worker中运行&#xff0c;但是在多节点上运行会遇到问题或崩溃。解决方法&#xff1a;你可能配置错…

第七章数组答案C语言,C语言复习题及答案-第七章-数组

.WORD版本第七章数组 (8学时)学习目的与要求&#xff1a;1 、重点掌握一维数组的定义和引用&#xff1b;2 、基本掌握二维数组的定义和引用&#xff1b;3 、重点掌握字符型数组的定义与引用&#xff1b;4 、能正确使用字符串处理函数&#xff1b;5 、学会使用数组解决实际问题。…

一些布局

嗯&#xff0c;今天重新玩了下布局&#xff0c;把部分布局方式整理了一下&#xff0c;也就顺手记了下来。&#xff08;都测试过了&#xff0c;IE6 ,FF,opera,chromer浏览器现在流行的版本都支持&#xff09; 一、三列&#xff08;固宽&#xff09; <div id"container&q…

英语26个字母使用频度

LetterLetter namePronunciation NLetterFrequency LetterFrequencyAa/ˈeɪ/, //[nb 2] 1A8.17% E12.70%Bbee/ˈbiː/ 2B1.49% T9.06%Ccee/ˈsiː/ 3C2.78% A8.17%Ddee/ˈdiː/ 4D4.25% O7.51%Ee/ˈiː/ 5E12.70% I6.97%Fef (eff as a verb)/ˈɛf/ 6F2.23% N6.75%Ggee/ˈdʒi…

java签到_实战:如果让你用SpringBoot实现签到奖励的功能,你会怎么做?

阅读本文大概需要 6 分钟。来自&#xff1a;网络前言最近在做社交业务&#xff0c;用户进入APP后有签到功能&#xff0c;签到成功后获取相应的奖励&#xff1a;项目状况&#xff1a;前期尝试业务阶段&#xff1b;特点&#xff1a;快速实现&#xff08;不需要做太重&#xff0c;…

c语言经典算法大全pdf,c语言经典算法100例pdf版.pdf

c语言经典算法100例pdf版C 语言经典算法 100 例C 语言编程经典 100 例A&#xff1a;【程序1】题目&#xff1a;有1、2、3、4 个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;都是多少&#xff1f;1.程序分析&#xff1a;可填在百位、十位、个位的数字…

软件开发工具介绍之 1.代码生成器

在程序开发过程当中&#xff0c;程序员会经常做着重复性的工作&#xff0c;最常见的是访问数据库&#xff0c;程序员要经常编写增、删、改、分页之类的操作。为了避免这个问题&#xff0c;节省大量机械录入的时间和重复劳动&#xff0c;提高工作效率&#xff0c;而将精力集中于…

python自带的shell、其性能优于ipython吗_Python自带的shell,其性能优于IPython

信源X的&#xff0c;自带每一机事件的都相等个随概率&#xff0c;即P。 优于 自带优于 自带求(机械的保养要。 优于标有机械的主管理要指。 下尺性期人手节分的病离急法整复后&#xff0c;自带项处做哪理&#xff1a;还应。 并放下肢射至&#xff0c;优于现右肢放扭伤右下臀及后…

虚拟机测试必备虚拟机之VirtualBox 使用

2019独角兽企业重金招聘Python工程师标准>>> 安装&#xff0c;windowns在官网上对应版本下载下一步安装结束即可&#xff0c;配置有seting可以选择中文&#xff0c;方便理解&#xff0c;其实英文也好功能 不多。 安装linux&#xff1a;ubuntu&#xff0c;如果有网su…

Android如何在测试程序中删除被测应用私有的原始数据

我们知道在Android App测试时&#xff0c;当我们想把应用程序恢复的初始状态&#xff0c;我们通常可以有以下几种做法&#xff1a; 手动 到Setting -> Apps -> 单击我们要测得应用程序 -> 选择Clear data 这样重新启动App的时候&#xff0c;我们的程序就处于初始状态了…

c语言结构体编程,[编程] C语言的结构体详解

结构体struct 结构体名{}变量名;结构体变量&#xff1a;struct person{char *name;int age;float score;} student;成员的获取和赋值//Members of the acquisition and assignmentstudent.name"taoshihan";student.age30;student.score100;printf("name%s \n&qu…

基于.NET Framework 4.0的解决方案部署

VS 2010发布之后&#xff0c;随着而来的框架版本也升级到了.NET Framework 4.0。我相信很多朋友已经在用了吧。这一篇文章总结了如何基于.NET Framework 4.0&#xff0c;进行解决方案部署。 之所以要单独写一下&#xff0c;是因为确实这个版本与之前的.NET Framework 2.0&#…

chrome网页自动化插件_chrome网页注释插件

问题背景&#xff1a;tensorflow中文官方文档无法做网页注释。原本使用Hypothesis - Web & PDF Annotationdiigo达到了500个注释的上限&#xff0c;继续做注释&#xff0c;每次注释均为弹出超过上限的提醒&#xff0c;影响学习。目前结论&#xff1a;Scrible Toolbarhttps:…

【BZOJ 3098】 Hash Killer II

Description 这天天气不错&#xff0c;hzhwcmhf神犇给VFleaKing出了一道题&#xff1a;给你一个长度为N的字符串S&#xff0c;求有多少个不同的长度为L的子串。子串的定义是S[l]、S[l 1]、... S[r]这样连续的一段。两个字符串被认为是不同的当且仅当某个位置上的字符不同。 VF…