c – 更改Windows DLL加载顺序? (加载顺序,不是搜索顺序)

前端之家收集整理的这篇文章主要介绍了c – 更改Windows DLL加载顺序? (加载顺序,不是搜索顺序)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
说我有一个可执行文件:app.exe

我在这个可执行文件中使用2个不同的第三方DLL:foo.dll bar.dll和应用程序必须隐式地链接到这些DLL,这是我不能使用:: LoadLibrary加载它们.

(注意:这不是我不能调用LoadLibrary,但这些DLL需要静态链接(C DLL与__declspec(dllexport)),所以我调用LoadLibrary不会有任何意义,因为可排除的加载程序已经调用它.)

这两个DLL没有任何依赖关系,也就是说,它们的加载顺序是未定义的,尽可能地告诉(并且应该是无关紧要的). (两者的依赖性基本上只在标准的windows dll(kernel32,msvcrt等)

我现在有这个问题,我想控制这些DLL的加载顺序,这是我希望foo.dll总是加载(DLL_PROCESS_ATTACH)在bar.dll之前.

是否可以告诉Windows DLL加载程序在另一个DLL之前加载一个DLL?

编辑:要检查可执行文件的DLL加载顺序,可以使用DUMPBIN.exe实用程序:(只需启动Visual Studio命令提示符)

编辑:根据this answer/this blog entry,NT Loader确实顺序进入导入部分. (这将导致独立的DLL按照导入部分显示的顺序加载).

C:\path\to\program> dumpbin /IMPORTS app.exe | grep -i \.dll
  MSVCR80D.dll
  KERNEL32.dll
  OLEAUT32.dll
  MSVCP80D.dll
  foo.dll
  bar.DLL

输出意味着MSVCR80D.dll(及其依赖项[a])将被首先加载,该bar.DLL将最后加载.卸载将以相反的顺序进行.

我还没有发现的是如何影响这个加载顺序…

(笔记)

[a]:这当然意味着例如kernel32.dll将首先加载,因为msvcr80d.dll将依赖于kernel32.dll.

根据一些要求,我正在为此添加一个理由:(但是,我一直对这一点仍然感兴趣,我知道如何解决MFC问题.)

Microsoft MFC DLL在它的调试版本内置内存泄漏检测(据我所知,这是与_CrtSetDbgFlag和相关工具使用的机制相同).

MFC调试DLL将卸载所有未被释放的内存.现在,如果你的进程中有一个第二个DLL,那就是独立于MFC,而这个第二个DLL释放DLL_PROCESS_DETACH上的内存,MFC报告机制会报告错误的内存泄漏,如果MFC DLL在其他DLL之前被卸载.

如果可以确保调试MFC DLL在最后的所有独立DLL中被首先/卸载,则所有其他DLL将自己清理,MFC将不会报告错误的泄漏.

解决方法

这是一个想法:在app.exe的链接器选项中如何标记为“延迟加载dll”?

延迟加载将允许您链接“静态”(即没有LoadLibrary()et.al),但是不会加载DLL,并且在实际需要之前进行链接.

如果这是一个选项,那么(假设你可以等待这么长时间,即不要在main()之前访问foo / bar dll函数),你可以在main()中访问一个函数(只是获取函数ptr或某些东西)在foo.dll中,首先加载它并绑定所有“静态”链接函数

(也许LoadLibrary()触发相同的链接,当需要的过程,不确定,它会看起来更干净的代码,尽管.)

原文链接:https://www.f2er.com/c/113558.html

猜你在找的C&C++相关文章