通常当试图运行一个使用DLL的EXE时,如果DLL丢失,你会得到一个标准的Windows错误:
程序无法启动,因为您的计算机中缺lessXXX.dll。 尝试重新安装程序来解决这个问题。
这似乎是内置到您的任何代码被调用之前的EXE …它是如何工作的,以及如何在Visual Studio中构build项目时设置它?
编辑:
如何在Linux上编译cmake,以便它可以生成vsproj文件?
dlldata.c不是在win32下生成的?
为什么在VCC 2003中编译这么长时间?
如果您需要pipe理员权限,Windows 7如何确定? (VC60)
在我的具体情况下,我实际上有一个DLL对其他DLL有“静态”依赖关系,所以如果这些DLL不存在,注册我的DLL失败,这有点难以诊断。 但我宁愿不手动列出使用的DLL函数,因为有很多!
无法获取Visual Studio C ++包含文件“excpt.h”以进行安装
改变当前的工作目录VS13?
如何将图标分配给Windows(或Visual Studio)上的可执行文件
什么是PE中的“隔离图像”属性?
当你链接到一个DLL有两种方法来做到这一点,隐式链接和显式链接。 你遇到的是一个隐式链接的失败。
隐式链接通过称为包含在使用PE(可执行可执行文件)格式的可执行映像中的导入表进行操作。 PE格式定义了导入和导出表。 导出表包含由DLL导出的函数列表及其入口点。 导入表包含其他模块的隐式依赖关系。
当可执行文件启动时,加载器读取导入表,然后尝试加载所有引用的DLL以及这些DLL中的所有函数。 这可能会失败,如果没有找到该DLL,如果该DLL未能正确加载,或者如果该DLL不包含引用的函数。 在你的情况下,它是失败的,因为加载程序没有找到DLL搜索路径中的XXX.dll 。
链接器将生成导入表。 在C ++中,这通常是通过该DLL的.lib文件完成的。
显式链接是代码调用LoadLibrary和GetProcAddress来加载DLL及其函数的地方。 通常,当您要编写可在不同系统上运行的应用程序时,会使用此方法。 例如,您可能希望使用仅在特定版本的操作系统上存在的某些功能,但在较早版本的操作系统上运行时会降级为某些其他行为。
提到链接到DLL时,不应使用术语“ 静态” 。 静态链接是指当函数的实现包含在图像中而不是包含在外部库中时。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。