SHLoadInProc在什么时候会卸载一个DLL?

SHLoadInProc在什么时候会卸载一个DLL?

作者:BlogUpdater |  时间:2021-04-21 |  浏览:994 |  评论已关闭 条评论

何谓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?》

标签:

评论已关闭。