MFC中使用LoadLibrary动态加载dll有个数限制吗?

梦想田园 2017-02-04 09:00:47
在MFC中,我用LoadLibrary动态加载dll,这个dll一直在使用没有卸载,当加载到80多个的时候,调用LoadLibrary就一直返回空了,请问这个加载dll有个数的限制吗?
...全文
645 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-02-06
  • 打赏
  • 举报
回复
在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。
zgl7903 2017-02-04
  • 打赏
  • 举报
回复
是不是内存/资源不足了? GetLastError 看错误代码
梦想田园 2017-02-04
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
是不是内存/资源不足了? GetLastError 看错误代码
当我调用FreeLibrary释放掉已加载的dll,就可以加载无限个dll了, 应该是内存资源不足吧?但是这个地方还不能释放掉,这个问题咋破呢?
梦想田园 2017-02-04
  • 打赏
  • 举报
回复
引用 7 楼 Dobzhansky 的回复:
出问题的总是某个dll? 还是随机的
是加载dll个数的问题,如果不调用FreeLibrary释放掉已加载的dll,加载个数是有限的
Dobzhansky 2017-02-04
  • 打赏
  • 举报
回复
出问题的总是某个dll? 还是随机的
梦想田园 2017-02-04
  • 打赏
  • 举报
回复
引用 5 楼 Dobzhansky 的回复:
加载同一个dll吗,dll 初始化干了啥
不是加载同一个dll,加载不同的dll有不同的用处,应该是没调用FreeLibrary释放的缘故,但是dll还没用完是不能释放的。
Dobzhansky 2017-02-04
  • 打赏
  • 举报
回复
加载同一个dll吗,dll 初始化干了啥
Dobzhansky 2017-02-04
  • 打赏
  • 举报
回复
WinError.h:#define ERROR_DLL_INIT_FAILED 1114L
梦想田园 2017-02-04
  • 打赏
  • 举报
回复
GetLastError返回的错误码为1114 经过测试是这样的: 在循环里连续调用LoadLibrary() 80多次后就再也无法加载dll了。 但是每次LoadLibrary() 之后再调用FreeLibrary释放掉就可以无限加载了。但这样做有违初衷,请问这个问题该怎么破?
  • 打赏
  • 举报
回复
错误代码 含义 0 系统内存不够,可执行文件被破坏或调用非法 2 文件没有被发现 3 路径没有被发现 5 企图动态链接一个任务错误或者有一个共享或网络保护错误 6 库需要为每个任务建立分离的数据段 8 没有足够的内存启动应用程序 10 Windows 版本不正确 11 可执行文件非法或不是Windows 应用程序,或在. EXE映像中有错误 12 应用程序为一个不同的操作系统设计(如 OS/2) 13 应用程序为 MS DOS 4. 0 设计 14 可执行文件的类型不知道 15 试图装载一个实模式应用程序(为早期Windows 版本设计) 16 试图装载包含可写的多个数据段的可执行文件的第二个实例 19 试图装载一个压缩的可执行文件(文件必须被解压后才能被装载) 20 DLL 文件非法 21 应用程序需要 32 位扩展
关于特定情况下的调用,比如DLL函数使用到了win32 API或者将C++生成的DLL供标准C语言使用,则需要注意以下一些情况:   如果使用到了win32 API,则应该使用调用方式为“__stdcall”。   在将C++生成的DLL供标准C语言使用,输出文件需要用“extern "C"”修饰,否则不能被标准C语言调用。如果使用“__stdcall”调用方式,可能产生C不识别的修饰名,所以设置导出函数时要采用.def文件形式,而不是__declspec(dllexport)形式。后者会进行修饰名转换,C语言无法识别函数。   下面的代码是一个定义文件的示例。   // SampleDLL.def   //   LIBRARY "sampleDLL"   EXPORTS   HelloWorld示例 DLL 和应用程序XXXXXXXX 在 Microsoft Visual C++ 6.0 ,可以通过选择“Win32 动态链接库”项目类型或“MFC 应用程序向导 (dll)”来创建 DLL。下面的代码是一个在 Visual C++ 通过使用“Win32 动态链接库”项目类型创建的 DLL 的示例。   // SampleDLL.cpp   //#include "stdafx.h"   #define EXPORTING_DLL   #include "sampleDLL.h"   BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)   {   return TRUE;   }   void HelloWorld(){   MessageBox( NULL, TEXT("Hello World"), TEXT("In a DLL"), MB_OK);   }   // File: SampleDLL.h   //#ifndef INDLL_H   #define INDLL_H   #ifdef EXPORTING_DLLextern __declspec(dllexport) void HelloWorld() ;   #elseextern __declspec(dllimport) void HelloWorld() ;   #endif   #endif   下面的代码是一个“Win32 应用程序”项目的示例,该示例调用 SampleDLL DLL 的导出 DLL 函数。   // SampleApp.cpp   //#include "stdafx.h"   #include "sampleDLL.h"   int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)   {   HelloWorld();   return 0;   }   注意:在加载动态链接,您必须链接在生成 SampleDLL 项目时创建的 SampleDLL.lib 导入库。   在运行时动态链接,您应使用与以下代码类似的代码来调用 SampleDLL.dll 导出 DLL 函数。   ...   typedef VOID (*DLLPROC) (LPTSTR);   ...   HINSTANCE hinstDLL;   DLLPROC HelloWorld;   BOOL fFreeDLL;   hinstDLL = LoadLibrary("sampleDLL.dll");   if (hinstDLL != NULL)   {   HelloWorld = (DLLPROC) GetProcAddress(hinstDLL, "HelloWorld");   if (HelloWorld != NULL)   (HelloWorld);   fFreeDLL = FreeLibrary(hinstDLL);   }   ...
一、 课程设计目的 学会用C++语言和数据结构知识实现表达式的解析与计算;学会使用动态链接库技术进行编程;学会编辑、编译、运行MFC应用程序的基本过程.学会MFC可视化编程技术。 二、 课程设计内容与实现的功能 1.C++语言的顺序结构,分支结构,循环结构,函数,结构体,指针,MFC可视化编程技术。 2.数据结构的二叉树数据组织、存贮、后序遍历及其操作。 3. 使用动态链接库进行函数模块的设计,实现计算功能。 4.编程使用动态连接库技术; 能实现表达式的输入,解析与计算 三、 系统分析与设计 1、系统分析 应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接。在使用DLL之前首先要知道DLL函数的结构信息。Visual C++6.0在VC in目录下提供了一个名为Dumpbin.exe的小程序,用它可以查看DLL文件的函数结构。另外,Windows系统将遵循下面的搜索顺序来定位DLL: 1.包含EXE文件的目录,2.进程的当前工作目录, 3.Windows系统目录, 4.Windows目录,5.列在Path环境变量的一系列目录。 1.隐式链接 隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当。实现隐式链接很容易,只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件就可以了 2.显式链接 显式链接是应用程序在执行过程随时可以加载DLL文件,也可以随时卸载DLL文件,这是隐式链接所无法作到的,所以显式链接具有更好的灵活性,对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序LoadLibraryMFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来,动态链接库的文件名即是上述两个函数的参数,此后再用GetProcAddress()获取想要引入的函数。自此,你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前,应该用FreeLibraryMFC提供的AfxFreeLibrary释放动态链接库。 2、系统设计: 按照系统设计要求,用Visual C++设计和开发一个MFC应用程序---高级计算器。计算器的界面设计、计算功能实现、算式计算和动态链接库的使用等。提交由需求分析:系统设计说明、系统技术文档、系统使用说明书和源程序代码为附录构成的实验报告。 2.1、模块设计: 1. 计算器界面 计算器界面包括主题“高级计算器”和背景图片以及电子日历。在计算区上有显示文本框和数字按钮以及运算符按钮。在计算区上部分有运算模式选择模块和小提示语句。 2. 模块功能简介 系统分为多个模块,分别为计算模块、错误分析模块、界面显示模块和模式选择模块。其计算模块用来进行各种基本的加、减、乘、除的运算并且显示运算结果;错误分析模块用来进行错误处理;界面显示模块用来美化计算器界面;模式选择模块用来进行运算模式的选择和切换,以实现不同的运算要求

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧