extern "C"
BOOL WINAPI Shell_GetImageLists(
_Out_ HIMAGELIST *phiml,
- _Out_ HIMAGELIST *phimlSmall
- );
+ _Out_ HIMAGELIST *phimlSmall);
extern HRESULT IUnknown_ShowDW(IUnknown * punk, BOOL fShow);
#include "newatlinterfaces.h"
-
/*
TODO:
**Provide implementation of new and delete that use LocalAlloc
LPWSTR pszBuf, UINT cchBuf, SFGAOF *rgfInOut)
{
CComPtr<IShellFolder> parentFolder;
- LPITEMIDLIST childPIDL;
+ LPITEMIDLIST childPIDL = NULL;
STRRET L108;
HRESULT hResult;
hResult = SHBindToFolderIDListParent(NULL, pidl, &IID_PPV_ARG(IShellFolder, &parentFolder), &childPIDL);
if (FAILED(hResult))
- return hResult;
+ goto cleanup;
hResult = parentFolder->GetDisplayNameOf(childPIDL, uFlags, &L108);
if (FAILED(hResult))
- return hResult;
+ goto cleanup;
StrRetToBufW(&L108, childPIDL, pszBuf, cchBuf);
if (rgfInOut)
{
hResult = parentFolder->GetAttributesOf(1, const_cast<LPCITEMIDLIST *>(&childPIDL), rgfInOut);
if (FAILED(hResult))
- return hResult;
+ goto cleanup;
}
- ILFree(childPIDL);
- return S_OK;
+ hResult = S_OK;
+
+cleanup:
+ if (childPIDL)
+ ILFree(childPIDL);
+ return hResult;
}
long IEGetNameAndFlags(LPITEMIDLIST pidl, SHGDNF uFlags, LPWSTR pszBuf, UINT cchBuf, SFGAOF *rgfInOut)
HICON icSmall = ImageList_GetIcon(himlSmall, indexOpen, 0);
HICON icLarge = ImageList_GetIcon(himlLarge, indexOpen, 0);
+ /* Hack to make it possible to release the old icons */
+ /* Something seems to go wrong with WM_SETICON */
+ HICON oldSmall = (HICON)SendMessage(WM_GETICON, ICON_SMALL, 0);
+ HICON oldLarge = (HICON)SendMessage(WM_GETICON, ICON_BIG, 0);
+
SendMessage(WM_SETICON, ICON_SMALL, reinterpret_cast<LPARAM>(icSmall));
SendMessage(WM_SETICON, ICON_BIG, reinterpret_cast<LPARAM>(icLarge));
- }
- // TODO: Update the window icon
+ DestroyIcon(oldSmall);
+ DestroyIcon(oldLarge);
+ }
FireCommandStateChangeAll();
hResult = UpdateForwardBackState();
{
HMENU mainMenu = LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU));
- //DbgPrint("Menu from shell32:\n");
- //DbgDumpMenu(hmenuShared);
-
- //DbgPrint("Menu from browseui:\n");
- //DbgDumpMenu(mainMenu);
-
Shell_MergeMenus(hmenuShared, mainMenu, 0, 0, FCIDM_BROWSERLAST, MM_SUBMENUSHAVEIDS);
- //DbgPrint("Merged menu:\n");
- //DbgDumpMenu(hmenuShared);
-
int GCCU(itemCount3) = GetMenuItemCount(hmenuShared);
Unused(itemCount3);
CComPtr<IShellMenu> shellMenu;
HRESULT hResult;
- //DbgPrint("SetMenuSB:\n");
- //DbgDumpMenu(hmenuShared);
-
if (hmenuShared && IsMenu(hmenuShared) == FALSE)
return E_FAIL;
hResult = GetMenuBand(IID_PPV_ARG(IShellMenu, &shellMenu));
return S_OK;
}
- if (fCurrentShellView->TranslateAcceleratorW(pmsg) != S_OK)
- {
- if (TranslateAcceleratorSB(pmsg, 0) != S_OK)
- return S_FALSE;
- return S_OK;
- }
- return S_OK;
+ if (!fCurrentShellView)
+ return S_FALSE;
+
+ return fCurrentShellView->TranslateAcceleratorW(pmsg);
}
HRESULT STDMETHODCALLTYPE CShellBrowser::_GetBorderDWHelper(IUnknown *punkSrc, LPRECT lprectBorder, BOOL bUseHmonitor)
return 0;
}
-template<class T>
-void ReleaseCComPtrExpectZero(CComPtr<T>& cptr, BOOL forceRelease = FALSE)
-{
- if (cptr.p != NULL)
- {
- int nrc = cptr->Release();
- if (nrc > 0)
- {
- DbgPrint("WARNING: Unexpected RefCount > 0!\n");
- if (forceRelease)
- {
- while (nrc > 0)
- {
- nrc = cptr->Release();
- }
- }
- }
- cptr.Detach();
- }
-}
-
LRESULT CShellBrowser::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
HRESULT hr;
menuIndex = 5;
}
- //DbgPrint("Before relay:\n");
- //DbgDumpMenu(theMenu);
-
LRESULT ret = RelayMsgToShellView(uMsg, wParam, menuIndex, bHandled);
- //DbgPrint("After relay:\n");
- //DbgDumpMenu(theMenu);
-
return ret;
}
HRESULT hResult;
MSG Msg;
BOOL Ret;
+
+ // Tell the thread ref we are using it.
+ if (parameters && parameters->offsetF8)
+ parameters->offsetF8->AddRef();
ATLTRY(theCabinet = new CComObject<CShellBrowser>);
if (theCabinet == NULL)
DispatchMessage(&Msg);
}
}
-
- //TerminateProcess(GetCurrentProcess(), hResult);
int nrc = theCabinet->Release();
if (nrc > 0)
{
- DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked, process will never terminate. Terminating forcefully.\n", nrc);
-
- //TerminateProcess(GetCurrentProcess(), 1);
+ DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked.\n", nrc);
}
theCabinet.Detach();
+ // Tell the thread ref we are not using it anymore.
+ if (parameters && parameters->offsetF8)
+ parameters->offsetF8->Release();
+
return hResult;
}
{
HRESULT hr;
IEThreadParamBlock * parameters = (IEThreadParamBlock *) lpThreadParameter;
- INITCOMMONCONTROLSEX iccex =
- {
- sizeof(iccex),
- 0xFFFF /* everything! */
- };
OleInitialize(NULL);
- InitCommonControlsEx(&iccex);
ATLTRY(hr = ExplorerMessageLoop(parameters));
OleUninitialize();
+ SHDestroyIETHREADPARAM(parameters);
+
return hr;
}