我正在維護使用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