`
conkeyn
  • 浏览: 1524443 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

非MFC DLL 之 DLL的调用方式

阅读更多

动态调用
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

 

分享到:
评论
1 楼 zhangzewenking 2009-11-12  
动态调用非mfc的dll,dll里面的如果是类怎么调用呢?

相关推荐

    MFC DLL动态调用及静态调用

    这种方式需要在DLL和主程序中都包含MFC库的动态链接版本(通常为msvcrt.dll和mfcmfc*.dll)。以下步骤概述了动态调用过程: 1. 创建MFC DLL项目:在Visual Studio中,选择MFC DLL模板,确保选中“Use MFC in a ...

    MFCDLL 生成及调用实例

    MFCDLL 生成及调用实例是C++编程领域中一个重要的实践课题,尤其是在Windows操作系统环境下,DLL(动态链接库)被广泛用于代码复用和模块化开发。本实例主要探讨如何创建MFC(Microsoft Foundation Classes)DLL以及...

    mfcdll调用方法

    在压缩包中,"mfcdll调用方法1lib库.rar"文件可能包含了一个示例,展示了如何通过lib库调用MFCDLL。而"mfcdll调用方法loaddll方式.rar"则可能提供了使用LoadLibrary方法的示例代码。这两个示例可以作为学习MFCDLL...

    QT调用dll和MFC调用QT的dll

    在软件开发中,有时我们需要在QT环境中调用动态链接库(DLL),或者将QT编译成DLL供MFC应用使用。这篇内容将深入探讨如何实现这些操作。 1. QT调用DLL: - 创建DLL:首先,你需要在QT环境中创建一个DLL项目,定义...

    MFCDLL.rar_MFCdll_mfc d_mfc 调用MFCdll_mfc 调用dll_visual Studio 200

    10. **MFCDLL.ncb**:Visual Studio的非编译信息文件,存储调试信息。 创建MFC DLL的过程如下: 1. **启动新项目**:在Visual Studio 2005中,选择“新建项目”,然后在模板中选择MFC DLL。这将生成一个基础框架,...

    MFC DLL的编写和调用示例

    本示例主要探讨如何使用MFC编写DLL以及如何在其他MFC应用程序中调用这些DLL。 1. **创建MFC DLL** - MFC DLL有三种类型:常规DLL、扩展DLL和MFC应用DLL。这里我们讨论的是MFC应用DLL,它与MFC应用程序共享同一个...

    MFC DLL的生成和调用实例

    MFC DLL的生成和调用实例 MFC DLL是Microsoft Foundation Classes(MFC)...MFC DLL的生成和调用实例提供了一种灵活的方式来将应用程序分解成多个模块,每个模块可以独立开发和维护,从而提高开发效率和代码重用率。

    非MFC DLL学习(VS2010)

    在VS2010中调试非MFC DLL,可以使用调试配置来设置断点,然后在调用DLL的程序中进行调试。通过查看调用堆栈和变量值,可以有效地定位和解决问题。 总的来说,非MFC DLL是一种灵活且高效的方法,用于在多个项目之间...

    调用MFC规则DLL的实例

    一个简单的调用MFC规则DLL的实例,有详细的代码注释和文档说明。欢迎学习编写MFC规则DLL(共享非静态)的同学们下载使用。

    MFCDll调用例子

    MFCDll调用例子是一个关于如何在Windows平台上利用Microsoft Foundation Class (MFC) 库创建和使用DLL(动态链接库)的学习资源。MFC 是一个C++类库,它为开发Windows应用程序提供了一种简化的方法,它封装了Windows...

    c#调用mfc共享dll 源码

    本主题主要关注如何在C#项目中调用由MFC编写的共享DLL(动态链接库)。在Windows环境下,DLL文件允许多个程序共享同一段代码和数据,从而节省内存资源和提高效率。 首先,我们需要理解MFC DLL的创建过程。在MFC中,...

    MFC调用DLL文件中的对话框.非模态形式

    调用DLL文件中的对话框_一个DLL的能成功_一个DLL不能成功DllDialogTest VS2010写的 一个基于对话框的MFC程序 然后创建两个常规动态DLL文件 在DLL文件中分别添加对话框 一个DLL的对话框能正常调用 另一个不行 均...

    VS2019 MFC DLL共享动态链接库(MFC 常规库)封装例程非模态调用例程。(里面包含MFC 扩展库何规则库两个例程)

    在这个例子中,"MFCLibrary2"可能是一个MFC扩展DLL,因为它提供了一个更灵活的方式,允许在DLL和调用应用程序之间创建和管理对象。 创建MFC DLL的步骤如下: 1. **启动新项目**:在VS2019中,选择“新建项目”,...

    MFCDLL0.rar MFC项目封装dll,并完成调用

    MFCDLL0.rar是一个包含MFC(Microsoft Foundation Classes)项目的压缩包,该项目的主要目标是将MFC界面功能封装到一个动态链接库(DLL)中,以便其他应用程序能够方便地调用这些功能。MFC是微软提供的C++类库,用于...

    制作带MFC界面的DLL以及调用

    本主题将深入探讨如何制作一个带有MFC界面的DLL以及如何在其他应用程序中调用这个DLL。 首先,创建MFC DLL项目。在Visual Studio中,选择“新建项目”,然后在模板列表中找到“MFC”类别,选择“MFC DLL”。在这个...

    MFC DLL调用示例(包含调用和DLL自身源代码)

    MCF制作DLL和调用DLL的源码,包含调用和DLL自身源代码

    QT调用mfc dll和qt dll

    QT调用MFC DLL和QT DLL是一个涉及到跨框架交互的重要技术主题,这在软件开发中尤其有用,因为不同的项目可能基于不同的库和技术栈。本文将深入探讨如何在QT环境中创建和使用DLL(动态链接库),以及如何实现QT与MFC...

    MFC规则的Dll静态调用

    本文将深入探讨“MFC规则的Dll静态调用”这一主题,包括DLL(动态链接库)的基本概念、MFC DLL的类型、静态链接与动态链接的区别以及如何实现MFC静态库的调用。 首先,DLL是一种可执行代码和数据的库形式,它可以在...

    MFC dll的创建与使用

    1. **常规DLL**:这种类型的DLL通常包含MFC的成员函数,可以被其他MFC或非MFC应用程序调用。共享DLL中的MFC库需要与调用它的应用程序使用相同的MFC版本。 2. **扩展DLL**:扩展DLL允许你添加新的MFC类,这些类可以...

    非MFC的dll静态调用

    非MFC(Microsoft Foundation Classes)的DLL静态调用是指不依赖于MFC框架的DLL,而是通过标准的C/C++语言接口进行调用。这种调用方式更通用,不受特定框架限制,适用于任何不使用或轻量级使用MFC的应用程序。 首先...

Global site tag (gtag.js) - Google Analytics