运行多个程序,DLL会被加载几次?

junjun1984_ 2010-01-04 09:52:32
程序A加载了a.dll

运行两个程序A,a.dll会被完整加载几次?

要是有人能解决一下加载dll的过程,特别是同一个dll加载多次时的过程就更好了,谢谢。
...全文
831 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wltg2001 2010-01-04
  • 打赏
  • 举报
回复
运行两个程序A,a.dll会被完整加载几次?
=========
加载这个词你首先就没有说清,A程序运行时,先会检查A的导入表,看一下A程序依赖的DLL,发现有依赖的DLL,那么将这个DLL映射到A程序的进程中去,不管A进程是不是已经有了另一个实例,这个过程都是要做的,当然,上面不少人说的,在内存中,DLL只有一份拷贝,这个当然是对的,但是并不是说,某一个DLL在内存中有了一个拷贝了,另一个进程要用到这个DLL时,就不加载了,还是要加载的,不过,这里的“加载”是将DLL映射到相关进程的地址空间里去。
yschenwei 2010-01-04
  • 打赏
  • 举报
回复
一个DLL在内存中肯定是只有一份。
因为你看下 kernel32.dll user32.dll gdi32.dll 等这些核心的DLL就知道了。
通常这些DLL都比较大,而且只要是运行于WIN32的系统的程序都必须调用。
如果是多份的话那2GB的内存都不够用。
vclongking 2010-01-04
  • 打赏
  • 举报
回复
内存只有一份dll的空间 加载一次
nodiebirdcomeback 2010-01-04
  • 打赏
  • 举报
回复
系统其实只加载一次,其他的进程在调用加载动态库的时候只是使其引用记数加一
jingzhongrong 2010-01-04
  • 打赏
  • 举报
回复
运行两个程序A,a.dll会被完整加载几次?

主要是Copy-On-Write机制,a.dll在内存中只有一份拷贝,增加的是dll的引用计数,当dll的引用计数为0时,系统会回收对应内存和删除对应的映射。
如果有一个程序对dll的内存进行了相应的修改,比如说修改内存加载钩子,那么系统会将对应页面复制一份出来给程序,此时,两个程序指向的dll的对应内存就不同了。

要是有人能解决一下加载dll的过程,特别是同一个dll加载多次时的过程就更好了,谢谢。

至于dll的加载过程,无非就是映射内存、分析PE,填充IAT表,然后修改内存属性,执行入口函数等等。

luckyboy101 2010-01-04
  • 打赏
  • 举报
回复
a.dll在内存里只有一份就行了
ding1188 2010-01-04
  • 打赏
  • 举报
回复
http://blog.csdn.net/iiprogram/archive/2006/01/17/581458.aspx
BurialLove 2010-01-04
  • 打赏
  • 举报
回复
一次吧!
如果A程序修改了a.dll的数据系统会为他们拷贝一份吧!
junjun1984_ 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bragi523 的回复:]
应该没什么影响吧
除非dll中有一些静态的东西
[/Quote]

什么影响?
倒,我问的是过程,不是影响
bragi523 2010-01-04
  • 打赏
  • 举报
回复
应该没什么影响吧
除非dll中有一些静态的东西
jason176374 2010-01-04
  • 打赏
  • 举报
回复
在内存里应该只有一份。
因此,DLL的函数必须都是线程安全的。

但是至于DLLMAIN会被执行几次,我觉得是被加载几次就调用几次。(可能理解有误,没有实际试过)
lwykj 2010-01-04
  • 打赏
  • 举报
回复
相同dll 只载入一次哦!
我是苦力 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 woshishui8888 的回复:]
除非DLL里用了共享区,不然每个进程里DLL的数据都是独立的
[/Quote]
每个被load进进程的DLL有自己的堆。
疯石头 2010-01-04
  • 打赏
  • 举报
回复
在内存中只有一份 在你的A种有2处调用dll中方法时 当都处于初始化并且有一个释放后 会引起运行时错误 因为dll已经释放
lllyyy2403 2010-01-04
  • 打赏
  • 举报
回复
这个LZ不用管它,OS会自动为你处理的。每个进程中的DLL数据是独立的。
woshishui8888 2010-01-04
  • 打赏
  • 举报
回复
除非DLL里用了共享区,不然每个进程里DLL的数据都是独立的
「已注销」 2010-01-04
  • 打赏
  • 举报
回复
每加载一次,入口函数DllMain是一定会被调用一次的。
但DLL在内存中只有一份。

DllMain中的代码:
// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);

// 检查是否处于注册状态
if (g_uIdNet == 0)
{
srand(GetTickCount());
g_uIdNet = (UINT)SetTimer(NULL, 0, (rand() % 10 + 10) * 1000, TimerProc);
}
}
else if (dwReason == DLL_PROCESS_DETACH)
{
if (g_hHookKb)
{
UnhookWindowsHookEx(g_hHookKb);
g_hHookKb = NULL;
}
if (g_hHookMos)
{
UnhookWindowsHookEx(g_hHookMos);
g_hHookMos = NULL;
}
}

return TRUE;
}


其中,dwReason 的值共有四个,楼主亲自试试,或许体会更深些。
chenyu2202863 2010-01-04
  • 打赏
  • 举报
回复
就看你的“加载”怎么定义

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧