69,377
社区成员
发帖
与我相关
我的任务
分享
HMODULE h0 = GetModuleHandleA( "gdi32.dll" );
printf("h0=%p\n", h0 );
HMODULE h1 = LoadLibrary( "gdi32.dll" );
printf("h=%p\n", h1 );
前两行通过输出可以肯定没有加载gdi32.dll,第三行加载gdi32.dll的时候,没有输出预先设置在DllMain中的字符串,说明此时加载的是system32下的gdi32.dll,而不是程序所在目录自定义的gdi32.dll。(为确保自己的gdi32.dll有正确的输出行为,加载时指定.\\gdi32.dll,能得到预期的结果)
这里就有问题了,它并没有按我期望的加载当前目录的DLL
我推测是内存中已经加载过gdi32.dll了,因为出现同名DLL,所以直接映射过来了,这个行为看起来还是根据文件名来的
但又做了测试,结果又不同
程序A加载A.dll不退出,程序B和它是不同文件夹,它也加载一个不同内容的A.dll,根据输出来看,最终加载的是程序B同目录的A.dll
程序A的A.dll仍在内存中,说明这里又没完全根据名称来,而是确实做了搜索工作的
这么说的话,是官方的DLL有特殊性?
其实最开始的问题主要是想知道,当物理内存中已经有一个同名DLL时,此时加载该名称的DLL是重新找还是直接映射到虚拟内存。
现在根据你们的解惑,算上完整路径的话,当找到的DLL和物理内存中的DLL的完整路径相同(即同一文件),那么直接从物理内存中映射过来;
如果找到的DLL和内存中同文件名的DLL(一个或多个)的路径不同,那么还是会将其加载到物理内存,并映射到当前程序的虚拟内存中
是这样的吧?我是这样理解的。
只不过,刚刚的gdi32.dll的测试并不完全符合这一行为。