- 浏览: 1524443 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (516)
- Java (49)
- Java/Struts 2.0 (25)
- Java/Spring、Spring MVC (11)
- Java/Quartz (3)
- Java/Lucene (6)
- Java/Hibernate (19)
- Java/openJPA (7)
- Java/DWR (7)
- Java/Security、Spring Security/OAuth2 (6)
- Java/Threading (9)
- Java/XML (22)
- java/design pattern (4)
- Android (2)
- JavaScript (46)
- jquery (3)
- DB/MySQL (23)
- DB/Oracle (16)
- PHP (25)
- CSS (20)
- Linux (38)
- C/C++、DLL、Makefile、VC++ (31)
- 正则 (9)
- Eclipse (4)
- 安全、网络等概念 (25)
- 集群 (7)
- 网页 (5)
- 视频\音频 (1)
- HTML (6)
- 计算机数学/算法 (3)
- Virtualbox (1)
- LDAP (2)
- 数据挖掘 (6)
- 工具破解 (1)
- 其他 (13)
- Mail (1)
- 药材 (3)
- 游戏 (2)
- hadoop (13)
- 压力测试 (3)
- 设计模式 (3)
- java/Swing (2)
- 缓存/Memcache (0)
- 缓存/Redis (1)
- OSGI (2)
- OSGI/Gemini (0)
- 文档写作 (0)
- java/Servlet (3)
- MQ/RabbitMQ (2)
- MQ/RocketMQ (0)
- MQ/Kafka (1)
- maven (0)
- SYS/linux (1)
- cache/redis (1)
- DB/Mongodb (2)
- nginx (1)
- postman (1)
- 操作系统/ubuntu (1)
- golang (1)
- dubbo (1)
- 技术管理岗位 (0)
- mybatis-plus (0)
最新评论
-
pgx89112:
大神,请赐我一份这个示例的项目代码吧,万分感谢,1530259 ...
spring的rabbitmq配置 -
string2020:
不使用增强器 怎么弄?
OpenJPA的增强器 -
孟江波:
学习了,楼主,能否提供一份源代码啊,学习一下,十分感谢!!!4 ...
spring的rabbitmq配置 -
eachgray:
...
spring-data-redis配置事务 -
qljoeli:
学习了,楼主,能否提供一份源代码啊,学习一下,十分感谢!!!1 ...
spring的rabbitmq配置
动态调用
typedef int(*lpAddFun)(int, int); //宏定义函数指针类型
int main(int argc, char *argv[])
{
HINSTANCE hDll; //DLL句柄
lpAddFun addFun; //函数指针
hDll = LoadLibrary("..\\Debug\\dllTest.dll");
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "add");
if (addFun != NULL)
{
int result = addFun(2, 3);
printf("%d", result);
}
FreeLibrary(hDll);
}
return 0;
}
在上边的例子中我们看到了由“LoadLibrary-GetProcAddress-FreeLibrary”系统Api提供的三位一体“DLL加载-DLL函数地址获取-DLL释放”方式,这种调用方式称为DLL的
动态调用。
动态调用方式的特点是完全由编程者用 API 函数加载和卸载 DLL,程序员可以决定 DLL 文件何时加载或不加载,显式链接在运行时决定加载哪个 DLL 文件。
与动态调用方式相对应的就是静态调用方式,“有动必有静”,这来源于物质世界的对立统一。“动与静”,其对立与统一竟无数次在技术领域里得到验证,譬如
静态IP与DHCP、静态路由与动态路由等。从前文我们已经知道,库也分为静态库与动态库DLL,而想不到,深入到DLL内部,其调用方式也分为静态与动
态。“动与静”,无处不在。《周易》已认识到有动必有静的动静平衡观,《易.系辞》曰:“动静有常,刚柔断矣”。哲学意味着一种普遍的真理,因此,我们经
常可以在枯燥的技术领域看到哲学的影子。
静态调用方式的特点是由编译系统完成对DLL的加载和应用程序结束时 DLL
的卸载。当调用某DLL的应用程序结束时,若系统中还有其它程序使用该
DLL,则Windows对DLL的应用记录减1,直到所有使用该DLL的程序都结束时才释放它。静态调用方式简单实用,但不如动态调用方式灵活。
下面我们来看看静态调用的例子
,将编译dllTest工程所生成的.lib和.dll文件拷入dllCall工程所在的路径,dllCall执行下列代码:
#pragma comment(lib,"dllTest.lib")
//.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息
extern "C" __declspec(dllimport) add(int x,int y);
int main(int argc, char* argv[])
{
int result = add(2,3);
printf("%d",result);
return 0;
}
由上述代码可以看出,静态调用方式的顺利进行需要完成两个动作
:
(1)告诉编译器与DLL相对应的.lib文件所在的路径及文件名,#pragma comment(lib,"dllTest.lib")就是起这个作用。
程序员在建立一个DLL文件时,连接器会自动为其生成一个对应的.lib文件,该文件包含了DLL 导出函数的符号名及序号(并不含有实际的代码)。在应用程序里,.lib文件将作为DLL的替代文件参与编译。
(2)声明导入函数,extern "C" __declspec(dllimport) add(int x,int y)语句中的__declspec(dllimport)发挥这个作用。
静态调用方式不再需要使用系统API来加载、卸载DLL以及获取DLL中导出函数的地址。这是因为,当程序员通过静态链接方式编译生成应用程序时,应用
程序中调用的与.lib文件中导出符号相匹配的函数符号将进入到生成的EXE
文件中,.lib文件中所包含的与之对应的DLL文件的文件名也被编译器存储在
EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows将根据这些信息发现并加载DLL,然后通过符号名实现对DLL
函数的动态链接。这样,EXE将能直接通过函数名调用DLL的输出函数,就象调用程序内部的其他函数一样。
http://www.cppblog.com/ivenher/articles/1314.html
发表评论
-
数据结构与算法分析(C语言描述)源代码与答案
2009-12-14 11:44 6715数据结构与算法分析(C语言描述)(第二版) Mark A ... -
A new Michael Jackson song
2009-10-12 16:48 948<!-- [if gte mso 9]><x ... -
makefile 大全
2009-02-24 07:37 1179http://chenl.blogbus.com/logs ... -
Linux_Unix环境下的Make和Makefile详解
2009-02-24 07:35 1320无论是在 Linux 还是在 U ... -
C++的11个注意要点
2009-02-24 07:33 1029C++ 的 11 个注意要点 ... -
运用autoconf和automake自动生成Makefile实例讲解
2009-02-24 07:30 4068运用 autoconf 和 automake ... -
makefile详解(6)
2009-02-24 07:23 1783makefile 详解( 6 ) ... -
makefile详解(5)
2009-02-24 07:22 1674<!-- --><!-- -->& ... -
makefile详解(4)
2009-02-24 07:21 1421<!-- --><!-- -->& ... -
makefile详解(3)
2009-02-24 07:20 1636<!-- --><!-- --> & ... -
makefile详解(2)
2009-02-24 07:19 1331<!-- --><!-- --> & ... -
makefile详解(1)
2009-02-24 07:18 1505makefile 详解 ... -
VC++动态链接库(DLL)编程深入浅出(二) Win32 Dynamic-Link Library
2008-08-19 14:23 8023上节给大家介绍了静态链接库与库的调试与查看( 动态链 ... -
VC++动态链接库(DLL)编程深入浅出(一) Win32 Static Library
2008-08-19 14:13 7115http://www.pconline.com.cn/pced ... -
VC++常用数据类型及其操作详解
2008-08-18 23:43 1383http://blog.csdn.net/flxyzsby/a ... -
VC++数据类型转换大全
2008-08-18 23:25 64097int i = 100; long l = 2001; f ... -
DLL导出变量
2008-08-18 16:20 2071DLL定义的全局变量可以被调用进程访问;DLL也可以访问调用进 ... -
DLL导出类
2008-08-18 16:20 2627DLL中定义的类可以在应用工程中使用。 下面的例子里,我 ... -
MFC规则DLL 概述
2008-08-18 16:19 2820MFC规则DLL的概念体现在两方面: (1) 它是MFC ... -
MFC规则DLL的创建
2008-08-18 16:18 1852我们来一步步讲述使用MFC向导创建MFC规则DLL的过程,首先 ...
相关推荐
这种方式需要在DLL和主程序中都包含MFC库的动态链接版本(通常为msvcrt.dll和mfcmfc*.dll)。以下步骤概述了动态调用过程: 1. 创建MFC DLL项目:在Visual Studio中,选择MFC DLL模板,确保选中“Use MFC in a ...
MFCDLL 生成及调用实例是C++编程领域中一个重要的实践课题,尤其是在Windows操作系统环境下,DLL(动态链接库)被广泛用于代码复用和模块化开发。本实例主要探讨如何创建MFC(Microsoft Foundation Classes)DLL以及...
在压缩包中,"mfcdll调用方法1lib库.rar"文件可能包含了一个示例,展示了如何通过lib库调用MFCDLL。而"mfcdll调用方法loaddll方式.rar"则可能提供了使用LoadLibrary方法的示例代码。这两个示例可以作为学习MFCDLL...
在软件开发中,有时我们需要在QT环境中调用动态链接库(DLL),或者将QT编译成DLL供MFC应用使用。这篇内容将深入探讨如何实现这些操作。 1. QT调用DLL: - 创建DLL:首先,你需要在QT环境中创建一个DLL项目,定义...
10. **MFCDLL.ncb**:Visual Studio的非编译信息文件,存储调试信息。 创建MFC DLL的过程如下: 1. **启动新项目**:在Visual Studio 2005中,选择“新建项目”,然后在模板中选择MFC DLL。这将生成一个基础框架,...
本示例主要探讨如何使用MFC编写DLL以及如何在其他MFC应用程序中调用这些DLL。 1. **创建MFC DLL** - MFC DLL有三种类型:常规DLL、扩展DLL和MFC应用DLL。这里我们讨论的是MFC应用DLL,它与MFC应用程序共享同一个...
MFC DLL的生成和调用实例 MFC DLL是Microsoft Foundation Classes(MFC)...MFC DLL的生成和调用实例提供了一种灵活的方式来将应用程序分解成多个模块,每个模块可以独立开发和维护,从而提高开发效率和代码重用率。
在VS2010中调试非MFC DLL,可以使用调试配置来设置断点,然后在调用DLL的程序中进行调试。通过查看调用堆栈和变量值,可以有效地定位和解决问题。 总的来说,非MFC DLL是一种灵活且高效的方法,用于在多个项目之间...
一个简单的调用MFC规则DLL的实例,有详细的代码注释和文档说明。欢迎学习编写MFC规则DLL(共享非静态)的同学们下载使用。
MFCDll调用例子是一个关于如何在Windows平台上利用Microsoft Foundation Class (MFC) 库创建和使用DLL(动态链接库)的学习资源。MFC 是一个C++类库,它为开发Windows应用程序提供了一种简化的方法,它封装了Windows...
本主题主要关注如何在C#项目中调用由MFC编写的共享DLL(动态链接库)。在Windows环境下,DLL文件允许多个程序共享同一段代码和数据,从而节省内存资源和提高效率。 首先,我们需要理解MFC DLL的创建过程。在MFC中,...
调用DLL文件中的对话框_一个DLL的能成功_一个DLL不能成功DllDialogTest VS2010写的 一个基于对话框的MFC程序 然后创建两个常规动态DLL文件 在DLL文件中分别添加对话框 一个DLL的对话框能正常调用 另一个不行 均...
在这个例子中,"MFCLibrary2"可能是一个MFC扩展DLL,因为它提供了一个更灵活的方式,允许在DLL和调用应用程序之间创建和管理对象。 创建MFC DLL的步骤如下: 1. **启动新项目**:在VS2019中,选择“新建项目”,...
MFCDLL0.rar是一个包含MFC(Microsoft Foundation Classes)项目的压缩包,该项目的主要目标是将MFC界面功能封装到一个动态链接库(DLL)中,以便其他应用程序能够方便地调用这些功能。MFC是微软提供的C++类库,用于...
本主题将深入探讨如何制作一个带有MFC界面的DLL以及如何在其他应用程序中调用这个DLL。 首先,创建MFC DLL项目。在Visual Studio中,选择“新建项目”,然后在模板列表中找到“MFC”类别,选择“MFC DLL”。在这个...
MCF制作DLL和调用DLL的源码,包含调用和DLL自身源代码
QT调用MFC DLL和QT DLL是一个涉及到跨框架交互的重要技术主题,这在软件开发中尤其有用,因为不同的项目可能基于不同的库和技术栈。本文将深入探讨如何在QT环境中创建和使用DLL(动态链接库),以及如何实现QT与MFC...
本文将深入探讨“MFC规则的Dll静态调用”这一主题,包括DLL(动态链接库)的基本概念、MFC DLL的类型、静态链接与动态链接的区别以及如何实现MFC静态库的调用。 首先,DLL是一种可执行代码和数据的库形式,它可以在...
1. **常规DLL**:这种类型的DLL通常包含MFC的成员函数,可以被其他MFC或非MFC应用程序调用。共享DLL中的MFC库需要与调用它的应用程序使用相同的MFC版本。 2. **扩展DLL**:扩展DLL允许你添加新的MFC类,这些类可以...
非MFC(Microsoft Foundation Classes)的DLL静态调用是指不依赖于MFC框架的DLL,而是通过标准的C/C++语言接口进行调用。这种调用方式更通用,不受特定框架限制,适用于任何不使用或轻量级使用MFC的应用程序。 首先...