Я поддерживаю приложение, которое использует значки оверлеев Windows Explorer. Иногда некоторые операции требуют, чтобы я принудительно обновлял представление исследователей для определенной папки. Я так используя следующую функцию, которая использует 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
экземпляров каждый раз это выполняется. Я не могу понять, почему на земле это происходит, поскольку, насколько я могу судить, они выпущены должным образом. Может ли кто-нибудь увидеть то, что мне не хватает?
Вы можете заменить IDispatch & IShellView на CComPtrs, BSTR на _bstr_t и VARIANT на _variant_t (comutil.h), таким образом, вы будете уверены, что ничего не утечка. –