为什么DLL在导入项没有成功解析时会加载失败?

短答案

因为我们测试过其他方案,只有这种方式是最好的。

长答案

在16位的Windows系统上,如果一个模块没有满足其所有的导入表,则它仍然可以被系统加载。只要你不调用一个丢失的导入项,则一切都还是正常的。如果你尝试调用一个丢失的导入项,程序将会立即崩溃并显示”不可恢复的错误”的对话框提示。

到了Win32时代,开发团队觉得这是一个很糟糕的设计,因为有时候人们会将一个为Windows 3.1开发的应用程序拷贝到Windows 3.0上并运行,一开始,这个应用程序运行的还不错,但是如果这个应用调用了一个只在Windows 3.1平台上可用的函数时(例如,GetSaveFileName这个函数),应用程序会立即崩溃。

因此Win32开发团队决定,如果有任何一个导入项没有被成功解析,则应用程序一开始加载的时候就会失败。如果上面例子中的应用程序开发商希望能将他们的应用运行在Windows 3.0上,则可以通过显式地使用GetProcAddress来表明这一点。因为如果必须显式调用GetProcAddress,则可能需要检查返回值。

当人们大声疾呼时,有时会出现此问题:”天哪,我应该有一种方法可以将导入项标记为’可选’-如果无法绑定,则加载应该不会失败。在调用绑定之前,应用程序有责任验证绑定是否成功。”,这些人可能是无意中在要求历史的重演,因为这又会回到我们一开始碰到问题的地方。

总结

如果对一个函数调用在当前平台上是否可用存在疑虑,可以尝试先用GetProcAddress来获取函数地址,如果函数不可用则进行相应的提示或者错误处理,尽量地让你的应用优雅的退出。

(0)

相关推荐

  • Win7启动项太多导致加载失败怎么解决

    win7系统启动项太多导致加载失败改如何解决,下面就为大家分享下解决方法. 方法一.系统设置 如果是由于系统设置问题,可对系统的开机启动项进行设定,用户可根据自己的需要设置哪些启动项不需要加载,哪些启 ...

  • win7系统启动项太多导致加载失败怎么办?

    win7系统启动项太多导致加载失败怎么办? 方案一.系统设置 如果是由于系统设置中有问题,可对Win7系统的开机启动项进行设定,用户可根据自己的需要设置哪些启动项不需要加载,哪些启动项可以加载. 方案 ...

  • win10系统下mfc100u.dll加载失败怎么办 win10电脑提示mfc100u.dll加载失败的解决方法

    不少windows10系统用户都遇到过dll文件加载失败的情况.比如,一位朋友反馈自己在使用win10电脑过程中,发现mfc100u.dll加载失败了,这该怎么办呢?下面就随我们的小编看看该问题的具体 ...

  • Win7系统启动项太多导致加载失败的两种解决方法

    win7系统启动项太多导致加载失败改如何解决,下面就为大家分享下两种解决方法,不会的朋友可以参考本文,希望能对大家有所帮助. 方法一.系统设置 如果是由于系统设置问题,可对系统的开机启动项进行设定,用 ...

  • 如何解决win10系统缺失Duilib.dll文件加载失败问题

    现在大部分电脑都是win10系统,有些用户遇到了缺失Duilib.dll文件加载失败问题,想知道如何解决,接下来小编就给大家介绍一下具体的操作步骤.具体如下:1. 首先第一步打开电脑浏览器,先在地址栏 ...

  • dnfTersafe.dll加载失败怎么办

    开始--运行--msconfig--启动--找到和你说的类似的选项dnfTersafe--取消勾--确定,然后 1,开始-运行-输入:regedit,然后回车 2,选择"我的电脑" ...

  • 组件对象模型(COM)加载项程序的加载或卸载

    如果您不是开发者,那么一般情况下不需要加载或卸载组件对象模型(COM)加载项。(加载项:为 Microsoft Office 提供自定义命令或自定义功能的补充程序。COM 加载项:通过添加自定义命令和 ...

  • Excel 2007无法安装加载项解决办法

    今天打开邮件看到一位朋友给我发来一封邮件,全文如下(略有删改): 最近在学数学模型,用规划求解来计算。以前用Excel XP,知道在工具中加载相关的宏,然后很顺利地就能求解。但是用Excel 2007 ...

  • Win7如何取消禁用加载项?

    Win7如何取消禁用加载项?