我说的是win32 dll,那些普通的pe文件.与我在explorer.exe进程中看到的相比,我在进行测试后感到困惑.
我用以下模块编写了一个测试:(C++)
DLLLoader.exe链接到同一文件夹中的A.dll.
B.dll链接到另一个文件夹中的A.dll(2).(A.dll(2)是与A.dll完全不同的DLL,但具有相同的名称)
DLLLoader.exe将通过:: LoadLibrary显式加载B.dll.
现在我开始DllLoader.exe,首先,A.DLL将被载入,但是当它试图加载B.DLL,它只是失败:我怀疑是因为B.DLL认为A.DLL已经加载的过程,但实际上,加载的一个不是B.dll想要的那个,导入/导出表无法匹配,所以B.dll无法加载.
这似乎告诉我们,我们不能在同一个进程中加载2个同名的dll,即使它们有不同的路径.
但是,当我使用进程资源管理器来监视Windows的explorer.exe进程中加载的模块时,我可以看到以下两个dll被加载,具有相同的名称:
comctl32.dll用户体验控件库C:\ WINDOWS\WinSxS ...\comctl32.dll
comctl32.dll公共控件库C:\ WINDOWS\system32\comctl32.dll
你们中的任何人都可以对此有所了解吗?
小智 6
如果您使用完整路径或仅通过文件名加载dll,它基本上取决于它.该LoadLibraryEx文档涵盖这还算不错:
如果lpFileName不包含路径,并且存在多个具有相同基本名称和扩展名的已加载模块,则该函数将返回首先加载的模块的句柄.
请参阅http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/b3eaa07f-7f92-4693-8aa1-b8fee0b92d2f/,以获得有关如何针对WinXP及其隐式执行此操作的详细讨论,激活上下文(清单)来控制加载.
| 归档时间: |
|
| 查看次数: |
8279 次 |
| 最近记录: |