当没有更多对象引用时,COM是否自动卸载DLL?

时间:2010-03-08 17:38:49

标签: c++ com vb6 scripting vbscript

例如,在语言X中:

let x = CreateOject( "MyProgID" )
x.LateBoundCall()
x.Release()  // (or setting x to Nothing in VB-like language, etc)

DLL MyProgID会发生什么? COM是否自动卸载DLL?

修改

这假设上面的代码是在一个不暴露任何COM的可执行文件中。

2 个答案:

答案 0 :(得分:10)

是的,但不是以确定的方式。 Windows会定期询问每个加载的DLL“is it safe to unload you now”吗?任何响应“是”的DLL都会被卸载。

请注意remark from MSDN

  

如果通过调用加载DLL   CoGetClassObject无法导出   DllCanUnloadNow,DLL不会   在应用程序调用之前卸载   CoUninitialize函数发布   OLE库。

请参阅此Old New Thing文章。

答案 1 :(得分:2)

您必须手动释放COM对象使用的资源。它们在内部使用ref计数器来保持对组件的引用数。如果组件仍然具有refcounter> 0,然后dll将不会卸载,资源将不会被释放。