SHLoadInProc在什么时候会卸载一个DLL?
何谓SHLoadInProc
SHLoadInProc函数能将一个模块装入到桌面外壳(Shell)的进程地址空间,然后保留它独自作任何操作。
调用者需要传入一个CLSID,指示待加载的对象类的GUID。
如果操作成功完成,也即成功地在外壳进程中国载入了DLL并创建了对象实例,则返回NOERROR,否则返回一个OLE错误代码。
需要注意的是,此函数在Windows Vista及后续版本就不再可用了,如果你在这类操作系统中调用它,系统只是简单地返回E_NOTIMPL。
SHLoadInProc函数会指示Explorer创建一个特定CLSID的实例。这会触发该CLSID所属的DLL被加载。
但是,这个DLL在什么时候被卸载呢?
这个问题,你必须通过仔细思考才能得到答案。
先这样想象一下:对象的创建是通过CoCreateInstance调用触发的,然后紧接着会立即释放被返回的对象,仅此而已。
从那一刻起,Explorer并不关心你的DLL,有了这个提示,你应该可以回答上面的问题了吧:DLL什么时候被卸载。
还是没整明白,那我再来一个提示:这个问题,根本就不是桌面外壳的问题,这个是COM的问题。也即:所有被CoCreateInstance调用触发加载的DLL,在什么时候卸载?
答案
DLL会被周期性地询问(通过DllCanUnloadNow函数):”现在可以安全地卸载了吗?”。如果DLL回复:是的(通过返回值S_OK),则COM库会卸载这个DLL。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《When does SHLoadInProc unload a DLL?》
相关推荐
- 第 802 期:微软提醒 Authenticator 将无法在已 Root 的手机上继续工作
- Posted on 07月01日
- 线程安全和可重入的区别
- Posted on 04月22日
- 第 563 期:微软确认 Windows 11 26H1 版本支持生命周期
- Posted on 03月20日
- 第 412 期:联想智能眼镜可连接电脑和手机,有望挑战苹果和 Meta
- Posted on 01月01日



评论已关闭。