我正在阅读有关内存的部分,这确实令人困惑。编译后的DLL到底会发生什么?
有些困扰我的问题:
是否仅将其加载到内存中,并且需要访问它的所有进程仅获得指向其所在位置的指针?
何时加载?我确定它不是在编译后随便加载到内存中的,所以是否有一个特殊的过程来加载它,或者Windows在某个进程需要它并保持其在其他进程之间共享时是否加载DLL?
从Microsoft文档
每个加载DLL的进程都将其映射到其虚拟地址空间。进程将DLL加载到其虚拟地址后,便可以调用导出的DLL函数。
“映射”看起来如何?我发现这有点令人困惑。
我不知道这是否是相关信息,但我对自定义DLL(由我编写的DLL)而不是系统DLL尤其感兴趣
答案 0 :(得分:0)
一个exe文件lists DLLs is wants to link to,因此,当加载程序加载一个exe时,它将加载按要求列出的DLL,除非它们已经被加载。 DLL可能在首次加载时运行初始化代码。
当然,可以按名称动态加载DLL,然后在程序发出LoadLibrary API调用时加载DLL。这对于实现可动态加载的插件很有用。
Windows为每个DLL保留一个引用计数器,因此当所有进程停止退出DLL时(通过退出或显式调用FreeLibrary
),Windows将卸载该DLL,从而使它有机会运行任何清理代码。 / p>