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?》
相关推荐
- VS Code中的CMake工具新功能速览
- Posted on 06月17日
- 深度理解:路由器中虚拟服务器(端口映射)的使用
- Posted on 06月13日
- 第 130 期:Windows 11 将提供更稳定系统驱动程序
- Posted on 07月21日
- 为什么硬盘指示灯每隔几秒钟闪烁一次?
- Posted on 02月17日



评论已关闭。