例如,在语言X中:
let x = CreateOject( "MyProgID" )
x.LateBoundCall()
x.Release() // (or setting x to Nothing in VB-like language, etc)
DLL MyProgID
会发生什么? COM是否自动卸载DLL?
这假设上面的代码是在一个不暴露任何COM的可执行文件中。
答案 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将不会卸载,资源将不会被释放。