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?》
相关推荐
- 只有当物理内存超过2GB时才需要/3GB
- Posted on 09月11日
- 深度理解:main函数的返回值
- Posted on 01月02日
- 实战经验:通过WMI获取硬件序列号
- Posted on 03月31日
- 在单选按钮上实现双击效果
- Posted on 01月01日
评论已关闭。