我正在维护使用Windows资源管理器覆盖图标的应用程序。偶尔有些操作要求我强制刷新某个特定文件夹的浏览器视图。我这样做使用下面的函数,它使用COM:为什么这个COM代码泄漏?
void RefreshExplorerView(CString strPath)
{
CComPtr<IShellWindows> pShellWindows;
CoInitialize(NULL);
if(SUCCEEDED(pShellWindows.CoCreateInstance(CLSID_ShellWindows)))
{
IDispatch* pFolder=NULL;
VARIANT variant;
V_VT(&variant) = VT_I4;
for(V_I4(&variant) = 0; pShellWindows->Item(variant, &pFolder) == S_OK; V_I4(&variant)++)
{
CComPtr<IWebBrowserApp> pWebBrowserApp;
if(SUCCEEDED(pFolder->QueryInterface(IID_PPV_ARGS(&pWebBrowserApp))))
{
BSTR LocationURL = NULL;
pWebBrowserApp->get_LocationURL(&LocationURL);
if(LocationURL != NULL && strPath.CompareNoCase(LocationURL) == 0)
{
CComPtr<IServiceProvider> pServiceProvider;
if(SUCCEEDED(pWebBrowserApp->QueryInterface(IID_PPV_ARGS(&pServiceProvider))))
{
CComPtr<IShellBrowser> pShellBrowser;
if(SUCCEEDED(pServiceProvider->QueryInterface(IID_PPV_ARGS(&pShellBrowser))))
{
IShellView* pShellView;
if(SUCCEEDED(pShellBrowser->QueryActiveShellView(&pShellView)))
{
pShellView->Refresh();
pShellView->Release();
}
}
}
}
SysFreeString(LocationURL);
}
pFolder->Release();
pFolder = NULL;
}
}
CoUninitialize();
}
我发现我的程序做这个刷新的时候经常是慢慢生长在大小和UMDH指示我,我似乎被泄漏pFolder
和pShellWindow
实例每次运行。我无法弄清楚为什么发生这种情况,因为据我所知可以正确释放。任何人都可以看到我失踪的东西吗?
您可以用_variant_t(comutil.h)替换CComPtrs和BSTR的_bstr_t和VARIANT的IDispatch&IShellView,这样就可以确保没有泄漏。 – 2013-05-03 09:55:00