- Revert 54075 hack (registration from old shell32 based on WINE), so things does not get registered twice. Two Control Panels in MyComputer are no longer visible
- Fix all regressions, which was hack-fixed before.
- Add more debug output in case of errors
svn path=/trunk/; revision=54673
BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len)
{
- HKEY hkey;
+ HKEY hkey;
BOOL ret = FALSE;
DWORD buflen = len;
WCHAR szName[100];
{
static const WCHAR wszLocalizedString[] =
{ 'L','o','c','a','l','i','z','e','d','S','t','r','i','n','g', 0 };
- if (!RegLoadMUIStringW(hkey, wszLocalizedString, szDest, len, NULL, 0, NULL) ||
- !RegQueryValueExW(hkey, swEmpty, 0, NULL, (LPBYTE)szDest, &len))
+ if (RegLoadMUIStringW(hkey, wszLocalizedString, szDest, len, NULL, 0, NULL) == ERROR_SUCCESS ||
+ !RegQueryValueExW(hkey, swEmpty, 0, NULL, (LPBYTE)szDest, &len) == ERROR_SUCCESS)
{
ret = TRUE;
}
if(LoadStringW(shell32_hInstance, IDS_ADMINISTRATIVETOOLS, szDest, buflen))
ret = TRUE;
}
-
}
+
TRACE("-- %s\n", debugstr_w(szDest));
return ret;
}
return FALSE;
hr = SHBindToParent(pidl, IID_IShellFolder, (VOID**)&psfFolder, &pidlLast);
- if (FAILED(hr)) return FALSE;
+ if (FAILED(hr))
+ {
+ ERR("SHBindToParent failed: %x\n", hr);
+ return FALSE;
+ }
dwAttributes = SFGAO_FILESYSTEM;
hr = psfFolder->GetAttributesOf(1, &pidlLast, &dwAttributes);
- if (FAILED(hr) || !(dwAttributes & SFGAO_FILESYSTEM)) {
+ if (FAILED(hr) || !(dwAttributes & SFGAO_FILESYSTEM))
+ {
+ WARN("Wrong dwAttributes or GetAttributesOf failed: %x\n", hr);
return FALSE;
}
{
TRACE("(%p)\n",pidl);
- return pidl && pidl->mkid.cb ? 0 : 1;
+ return pidl && pidl->mkid.cb ? 0 : 1;
}
BOOL _ILIsMyDocuments(LPCITEMIDLIST pidl)
#define PT_NETWORK 0x47
#define PT_IESPECIAL1 0x61
#define PT_YAGUID 0x70 /* yet another guid.. */
+#define PT_CPEXT 0x71
#define PT_IESPECIAL2 0xb1
#define PT_SHARE 0xc3
{
NoRemove CLSID
{
- ForceRemove {21EC2020-3AEA-1069-A2DD-08002B30309D}
+ ForceRemove {21EC2020-3AEA-1069-A2DD-08002B30309D} = s 'Control Panel'
{
val InfoTip = e '@%%SystemRoot%%\system32\SHELL32.dll,-31361'
DefaultIcon = e '%%SystemRoot%%\System32\shell32.dll,-137'
}
ShellFolder
{
- val Attributes = d '0'
+ val Attributes = d '&H00000000'
val HideAsDeletePerUser = s ''
val WantsFORDISPLAY = s ''
}
}
'ShellFolder'
{
- val Attributes = d '&H60000100'
+ val Attributes = d '&H60000000'
val WantsFORPARSING = s ''
}
}
HMENU hSubMenu = NULL;
OPEN_WITH_CONTEXT Context;
- if (LoadStringW(shell32_hInstance, IDS_OPEN_WITH, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)) < 0)
+ if (!LoadStringW(shell32_hInstance, IDS_OPEN_WITH, szBuffer, sizeof(szBuffer)/sizeof(WCHAR)))
{
- TRACE("failed to load string\n");
+ ERR("failed to load string\n");
return E_FAIL;
}
- szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0';
hSubMenu = CreatePopupMenu();
MENUITEMINFOW mii;
POPEN_ITEM_CONTEXT pItemContext;
LRESULT index;
- WCHAR * Offset;
+ WCHAR *pwszExt;
WCHAR Buffer[_MAX_FNAME];
pItemContext = (OPEN_ITEM_CONTEXT *)HeapAlloc(GetProcessHeap(), 0, sizeof(OPEN_ITEM_CONTEXT));
/* store app path */
wcscpy(pItemContext->szAppName, szAppName);
- /* null terminate it */
- pItemContext->szAppName[MAX_PATH-1] = 0;
/* extract path name */
_wsplitpath(szAppName, NULL, NULL, Buffer, NULL);
- Offset = wcsrchr(Buffer, '.');
- if (Offset)
- Offset[0] = L'\0';
+ pwszExt = wcsrchr(Buffer, '.');
+ if (pwszExt)
+ pwszExt[0] = L'\0';
Buffer[0] = towupper(Buffer[0]);
if (pContext->bMenu)
pItemContext->hIcon = ExtractIconW(shell32_hInstance, szAppName, 0);
/* get manufacturer */
GetManufacturer(pItemContext->szAppName, pItemContext);
- index = SendMessageW(pContext->hDlgCtrl, LB_ADDSTRING, 0, (LPARAM)Buffer);
+ index = SendMessageW(pContext->hDlgCtrl, LB_ADDSTRING, 0, (LPARAM)Buffer);
if (index != LB_ERR)
SendMessageW(pContext->hDlgCtrl, LB_SETITEMDATA, index, (LPARAM)pItemContext);
}
/* open mru list */
hList = OpenMRUList(hKey);
if (!hList)
+ {
+ ERR("OpenMRUList failed\n");
return;
+ }
/* get list count */
nCount = EnumMRUListW(hList, -1, NULL, 0);
if (RegGetValueW(hSubKey, NULL, NULL, RRF_RT_REG_SZ, NULL, (PVOID)szBuffer, &dwBuffer) == ERROR_SUCCESS)
{
- WCHAR * Ext = wcsrchr(szBuffer, ' ');
- if (Ext)
+ WCHAR * pszSpace = wcsrchr(szBuffer, ' ');
+ if (pszSpace)
{
/* erase %1 or extra arguments */
- Ext[0] = 0;
+ *pszSpace = 0; // FIXME: what about '"'
}
if(!HideApplicationFromList(szBuffer))
InsertOpenWithItem(pContext, szBuffer);
LPCITEMIDLIST pidl_folder;
LPCITEMIDLIST pidl_child;
LPCITEMIDLIST pidl;
- DWORD dwPath;
- LPWSTR szPtr;
+ DWORD dwType;
+ LPWSTR pszExt;
static const WCHAR szShortCut[] = { '.','l','n','k', 0 };
fmt.cfFormat = RegisterClipboardFormatW(CFSTR_SHELLIDLIST);
return hr;
}
- /*assert(pida->cidl==1);*/
pida = (LPIDA)GlobalLock(medium.hGlobal);
+ ASSERT(pida->cidl==1);
- pidl_folder = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[0]);
- pidl_child = (LPCITEMIDLIST) ((LPBYTE)pida+pida->aoffset[1]);
+ pidl_folder = (LPCITEMIDLIST) ((LPBYTE)pida + pida->aoffset[0]);
+ pidl_child = (LPCITEMIDLIST) ((LPBYTE)pida + pida->aoffset[1]);
pidl = ILCombine(pidl_folder, pidl_child);
return E_OUTOFMEMORY;
}
if (_ILIsDesktop(pidl) || _ILIsMyDocuments(pidl) || _ILIsControlPanel(pidl) || _ILIsNetHood(pidl) ||
- _ILIsBitBucket(pidl) || _ILIsDrive(pidl) || _ILIsCPanelStruct(pidl) || _ILIsFolder(pidl) || _ILIsControlPanel(pidl))
+ _ILIsBitBucket(pidl) || _ILIsDrive(pidl) || _ILIsCPanelStruct(pidl) || _ILIsFolder(pidl))
{
TRACE("pidl is a folder\n");
SHFree((void*)pidl);
if (!SHGetPathFromIDListW(pidl, szPath))
{
+ IID *iid = _ILGetGUIDPointer(pidl);
SHFree((void*)pidl);
- ERR("SHGetPathFromIDListW failed\n");
+ ERR("SHGetPathFromIDListW failed %s\n", iid ? shdebugstr_guid(iid) : "");
return E_FAIL;
}
-
+
SHFree((void*)pidl);
TRACE("szPath %s\n", debugstr_w(szPath));
- if (GetBinaryTypeW(szPath, &dwPath))
+ if (GetBinaryTypeW(szPath, &dwType))
{
- TRACE("path is a executable %x\n", dwPath);
+ TRACE("path is a executable %x\n", dwType);
return E_FAIL;
}
- szPtr = wcsrchr(szPath, '.');
- if (szPtr)
+ pszExt = wcsrchr(szPath, L'.');
+ if (pszExt && !_wcsicmp(pszExt, szShortCut))
{
- if (!_wcsicmp(szPtr, szShortCut))
- {
- FIXME("pidl is a shortcut\n");
- return E_FAIL;
- }
+ FIXME("pidl is a shortcut\n");
+ return E_FAIL;
}
+
return S_OK;
}
HRESULT WINAPI
COpenWithMenu::Initialize(LPCITEMIDLIST pidlFolder,
- IDataObject *pdtobj, HKEY hkeyProgID )
+ IDataObject *pdtobj,
+ HKEY hkeyProgID)
{
TRACE("This %p\n", this);
return SHEOW_LoadOpenWithItems(pdtobj);
}
-HRESULT WINAPI SHOpenWithDialog(
- HWND hwndParent,
- const OPENASINFO *poainfo
-)
+HRESULT WINAPI
+SHOpenWithDialog(HWND hwndParent,
+ const OPENASINFO *poainfo)
{
MSG msg;
BOOL bRet;
if (FAILED(hr))
return hr;
- // extra registration stuff for the IShellFolder
- return DoRegisterServer();
+ hr = SHELL_RegisterShellFolders();
+ if (FAILED(hr))
+ return hr;
+
+ return S_OK;
}
/***********************************************************************
if (FAILED(hr))
return hr;
- // extra stuff which is performed for IShellFolder
- return DoUnregisterServer();
+ return S_OK;
}
/*************************************************************************
if (!pszPath)
return E_OUTOFMEMORY;
- ZeroMemory(pszPath, (MAX_PATH +1) * sizeof(WCHAR));
+ ZeroMemory(pszPath, (MAX_PATH + 1) * sizeof(WCHAR));
- if (_ILIsAdminTools (pidl))
+ if (!pidl->mkid.cb)
{
if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
(GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
return E_INVALIDARG;
if (*rgfInOut == 0)
- *rgfInOut = ~0;
+ *rgfInOut = ~0;
- while(cidl > 0 && *apidl) {
- pdump(*apidl);
- SHELL32_GetItemAttributes(this, *apidl, rgfInOut);
- apidl++;
- cidl--;
+ while(cidl > 0 && *apidl)
+ {
+ pdump(*apidl);
+ SHELL32_GetItemAttributes(this, *apidl, rgfInOut);
+ apidl++;
+ cidl--;
}
/* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
*rgfInOut &= ~SFGAO_VALIDATE;
CHAR szName[MAX_PATH];
WCHAR wszName[MAX_PATH+1]; /* +1 for potential backslash */
PIDLCPanelStruct *pCPanel;
+ HRESULT hr;
*szName = '\0';
TRACE("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
pdump(pidl);
- if (!pidl || !strRet)
- return E_INVALIDARG;
+ if (!pidl)
+ return S_FALSE;
pCPanel = _ILGetCPanelPointer(pidl);
else if (_ILIsSpecialFolder(pidl))
{
BOOL bSimplePidl = _ILIsPidlSimple(pidl);
-
- if (bSimplePidl)
+ SFGAOF Attr = SFGAO_FILESYSTEM;
+
+ SHELL32_GetItemAttributes(this, pidl, &Attr);
+ if (Attr & SFGAO_FILESYSTEM)
+ {
+ hr = SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, wszName, sizeof(wszName));
+ if (FAILED(hr))
+ return hr;
+ }
+ else if (bSimplePidl)
{
_ILSimpleGetTextW(pidl, wszName, MAX_PATH); /* append my own path */
}
else
{
FIXME("special pidl\n");
- }
-
- if ((dwFlags & SHGDN_FORPARSING) && !bSimplePidl)
- {
- /* go deeper if needed */
- int len = 0;
+ if (dwFlags & SHGDN_FORPARSING)
+ {
+ /* go deeper if needed */
+ int cchName;
- PathAddBackslashW(wszName);
- len = wcslen(wszName);
+ PathAddBackslashW(wszName);
+ cchName = wcslen(wszName);
- if (!SUCCEEDED(SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, wszName + len, MAX_PATH + 1 - len)))
- return E_OUTOFMEMORY;
-
- if (!WideCharToMultiByte(CP_ACP, 0, wszName, -1, szName, MAX_PATH, NULL, NULL))
- wszName[0] = '\0';
- }
- else
- {
- if (bSimplePidl)
- {
- if (!WideCharToMultiByte(CP_ACP, 0, wszName, -1, szName, MAX_PATH, NULL, NULL))
- wszName[0] = '\0';
+ hr = SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, wszName + cchName, MAX_PATH + 1 - cchName);
+ if (FAILED(hr))
+ return hr;
}
}
+
+ if (!WideCharToMultiByte(CP_ACP, 0, wszName, -1, szName, MAX_PATH, NULL, NULL))
+ szName[0] = '\0';
}
strRet->uType = STRRET_CSTR;
dwSize = sizeof(szCmd);
if (RegGetValueW(HKEY_CLASSES_ROOT, szBuffer, NULL, RRF_RT_REG_SZ, &dwType, (PVOID)szCmd, &dwSize) != ERROR_SUCCESS)
{
- ERR("RegGetValueW failed with %u\n", GetLastError());
+ ERR("RegGetValueW(%ls) failed with %u\n", szBuffer, GetLastError());
return E_FAIL;
}
-#if 0
- if (dwType != RRF_RT_REG_SZ && dwType != RRF_RT_REG_EXPAND_SZ)
- return E_FAIL;
-#endif
-
if (!ExpandEnvironmentStringsW(szCmd, szExpCmd, sizeof(szExpCmd)/sizeof(WCHAR)))
return E_FAIL;
return E_INVALIDARG;
if (StringFromCLSID(*iid, &pOleStr) == S_OK)
{
-
hr = ExecuteAppletFromCLSID(pOleStr);
CoTaskMemFree(pOleStr);
return hr;
*/
HRESULT WINAPI CFontsFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
{
- PIDLFontStruct * pfont;
+ PIDLFontStruct *pFont;
TRACE("ISF_Fonts_fnGetDisplayNameOf (%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
pdump (pidl);
if (!strRet)
return E_INVALIDARG;
- pfont = _ILGetFontStruct(pidl);
- if (!pfont)
- return E_INVALIDARG;
+ pFont = _ILGetFontStruct(pidl);
+ if (pFont)
+ {
+ strRet->pOleStr = (LPWSTR)CoTaskMemAlloc((wcslen(pFont->szName)+1) * sizeof(WCHAR));
+ if (!strRet->pOleStr)
+ return E_OUTOFMEMORY;
- strRet->pOleStr = (LPWSTR)CoTaskMemAlloc((wcslen(pfont->szName)+1) * sizeof(WCHAR));
- if (!strRet->pOleStr)
- return E_OUTOFMEMORY;
+ wcscpy(strRet->pOleStr, pFont->szName);
+ strRet->uType = STRRET_WSTR;
+ }
+ else if (!pidl->mkid.cb)
+ {
+ WCHAR wszPath[MAX_PATH];
- wcscpy(strRet->pOleStr, pfont->szName);
- strRet->uType = STRRET_WSTR;
+ if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) &&
+ (GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING))
+ {
+ if (!SHGetSpecialFolderPathW(NULL, wszPath, CSIDL_FONTS, FALSE))
+ return E_FAIL;
+ }
+ else if (!HCR_GetClassNameW(CLSID_FontsFolderShortcut, wszPath, MAX_PATH))
+ return E_FAIL;
+
+ strRet->pOleStr = (LPWSTR)CoTaskMemAlloc((wcslen(wszPath) + 1) * sizeof(WCHAR));
+ if (!strRet->pOleStr)
+ return E_OUTOFMEMORY;
+
+ wcscpy(strRet->pOleStr, wszPath);
+ strRet->uType = STRRET_WSTR;
+ }
+ else
+ return E_INVALIDARG;
return S_OK;
}
RegGetValueW(hKey, wszBuf, NULL, RRF_RT_REG_SZ, NULL, wszBuf, &dwSize);
}
- /* FIXME: shell extensions, shouldn't the type be
- * PT_SHELLEXT? */
+ /* FIXME: shell extensions - the type should be PT_SHELLEXT (tested) */
pidl = _ILCreateGuidFromStrW(wszBuf);
if (pidl != NULL)
bRet = AddToEnumList(pidl);
+ else
+ ERR("Invalid MyComputer namespace extesion: %s\n", wszBuf);
j++;
}
else if (ERROR_NO_MORE_ITEMS == ErrorCode)
{
DWORD dwSize;
WCHAR szName[MAX_PATH];
+ WCHAR wszMyCompKey[256];
+ INT i;
pidlRoot = _ILCreateMyComputer(); /* my qualified pidl */
if (pidlRoot == NULL)
return E_OUTOFMEMORY;
+ i = swprintf(wszMyCompKey, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\");
+ StringFromGUID2(CLSID_MyComputer, wszMyCompKey + i, sizeof(wszMyCompKey)/sizeof(wszMyCompKey[0]) - i);
dwSize = sizeof(szName);
- if (RegGetValueW(HKEY_CURRENT_USER,
- L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\{20D04FE0-3AEA-1069-A2D8-08002B30309D}",
+ if (RegGetValueW(HKEY_CURRENT_USER, wszMyCompKey,
NULL, RRF_RT_REG_SZ, NULL, szName, &dwSize) == ERROR_SUCCESS)
{
- szName[MAX_PATH - 1] = 0;
sName = (LPWSTR)SHAlloc((wcslen(szName) + 1) * sizeof(WCHAR));
if (sName)
{
if (*rgfInOut == 0)
*rgfInOut = ~0;
- if(cidl == 0) {
+ if(cidl == 0)
*rgfInOut &= dwComputerAttributes;
- } else {
- while (cidl > 0 && *apidl) {
+ else
+ {
+ while (cidl > 0 && *apidl)
+ {
pdump (*apidl);
SHELL32_GetItemAttributes (this, *apidl, rgfInOut);
apidl++;
return E_INVALIDARG;
}
- if (_ILIsPrinter(pidl))
+ if (!pidl->mkid.cb)
{
pszName = (LPWSTR)CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR));
if (!pszName)
TRACE ("(%p)->(pidl=%p 0x%08x %p 0x%08x)\n", psf, pidl, dwFlags, szOut, dwOutLen);
pdump (pidl);
- pidlFirst = ILCloneFirst (pidl);
- if (pidlFirst) {
- IShellFolder2 *psfChild;
+ pidlFirst = ILCloneFirst(pidl);
+ if (pidlFirst)
+ {
+ IShellFolder *psfChild;
- hr = psf->BindToObject(pidlFirst, NULL, IID_IShellFolder, (LPVOID *) & psfChild);
- if (SUCCEEDED (hr)) {
- STRRET strTemp;
- LPITEMIDLIST pidlNext = ILGetNext (pidl);
+ hr = psf->BindToObject(pidlFirst, NULL, IID_IShellFolder, (LPVOID *) & psfChild);
+ if (SUCCEEDED (hr))
+ {
+ STRRET strTemp;
+ LPITEMIDLIST pidlNext = ILGetNext (pidl);
- hr = psfChild->GetDisplayNameOf(pidlNext, dwFlags, &strTemp);
- if (SUCCEEDED (hr)) {
- if(!StrRetToStrNW (szOut, dwOutLen, &strTemp, pidlNext))
+ hr = psfChild->GetDisplayNameOf(pidlNext, dwFlags, &strTemp);
+ if (SUCCEEDED (hr))
+ {
+ if(!StrRetToStrNW (szOut, dwOutLen, &strTemp, pidlNext))
hr = E_FAIL;
+ }
+ psfChild->Release();
}
- psfChild->Release();
- }
- ILFree (pidlFirst);
+ ILFree (pidlFirst);
} else
- hr = E_OUTOFMEMORY;
+ hr = E_OUTOFMEMORY;
TRACE ("-- ret=0x%08x %s\n", hr, debugstr_w(szOut));
dwAttributes = *pdwAttributes;
- if (_ILIsDrive (pidl)) {
+ /* Attributes of some special folders are hardcoded */
+ if (_ILIsDrive(pidl)) {
*pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FILESYSTEM|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR|
- SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANRENAME;
+ SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANRENAME;
+ } else if (_ILIsMyComputer(pidl) || _ILIsNetHood(pidl)) {
+ *pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR|
+ SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANDELETE|
+ SFGAO_CANRENAME|SFGAO_CANLINK;
+ } else if (_ILIsControlPanel(pidl)) {
+ *pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_CANLINK;
} else if (has_guid && HCR_GetFolderAttributes(pidl, &dwAttributes)) {
- *pdwAttributes = dwAttributes;
- } else if (_ILGetDataPointer (pidl)) {
- dwAttributes = _ILGetFileAttributes (pidl, NULL, 0);
+ *pdwAttributes = dwAttributes;
+ } else if (_ILGetDataPointer(pidl)) {
+ dwAttributes = _ILGetFileAttributes(pidl, NULL, 0);
if (!dwAttributes && has_guid) {
WCHAR path[MAX_PATH];
}
}
- /* Set common attributes */
- *pdwAttributes |= SFGAO_FILESYSTEM | SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANDELETE |
- SFGAO_CANRENAME | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANCOPY;
+ /* Set common attributes */
+ *pdwAttributes |= SFGAO_FILESYSTEM | SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANDELETE |
+ SFGAO_CANRENAME | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANCOPY;
if (dwAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
ici.lpVerb = MAKEINTRESOURCEA( def );
ici.hwnd = m_hWnd;
- if (cm->InvokeCommand((LPCMINVOKECOMMANDINFO) &ici ) == S_OK)
+ hr = cm->InvokeCommand((LPCMINVOKECOMMANDINFO)&ici);
+ if (hr == S_OK)
{
- DestroyMenu( hmenu );
+ DestroyMenu(hmenu);
hr = IUnknown_SetSite(cm, NULL);
return S_OK;
}
+ else
+ ERR("InvokeCommand failed: %x\n", hr);
}
+ else
+ ERR("No default context menu item\n");
}
DestroyMenu( hmenu );
{
CF_IDLIST = RegisterClipboardFormatW(CFSTR_SHELLIDLIST);
}
-
+
fetc.cfFormat = CF_IDLIST;
fetc.ptd = NULL;
fetc.dwAspect = DVASPECT_CONTENT;
return ret;
}
+static
VOID
DisablePasteOptions(HMENU hMenu)
{
HRESULT
-IDefaultContextMenuImpl::SH_LoadDynamicContextMenuHandler(HKEY hKey, const CLSID * szClass, BOOL bExternalInit)
+IDefaultContextMenuImpl::SH_LoadDynamicContextMenuHandler(HKEY hKey, const CLSID * pClass, BOOL bExternalInit)
{
HRESULT hr;
IContextMenu * cmobj;
IShellExtInit *shext;
PDynamicShellEntry curEntry;
- //WCHAR szTemp[100];
LPOLESTR pstr;
- StringFromCLSID(*szClass, &pstr);
+ StringFromCLSID(*pClass, &pstr);
- TRACE("SH_LoadDynamicContextMenuHandler entered with This %p hKey %p szClass %s bExternalInit %u\n",this, hKey, wine_dbgstr_guid(szClass), bExternalInit);
- //swprintf(szTemp, L"This %p hKey %p szClass %s bExternalInit %u", this, hKey, pstr, bExternalInit);
- //MessageBoxW(NULL, szTemp, NULL, MB_OK);
+ TRACE("SH_LoadDynamicContextMenuHandler entered with This %p hKey %p pClass %s bExternalInit %u\n", this, hKey, wine_dbgstr_guid(pClass), bExternalInit);
- if (IsShellExtensionAlreadyLoaded(szClass))
+ if (IsShellExtensionAlreadyLoaded(pClass))
return S_OK;
- hr = SHCoCreateInstance(NULL, szClass, NULL, IID_IContextMenu, (void**)&cmobj);
+ hr = SHCoCreateInstance(NULL, pClass, NULL, IID_IContextMenu, (void**)&cmobj);
if (hr != S_OK)
{
- TRACE("SHCoCreateInstance failed %x\n", GetLastError());
+ ERR("SHCoCreateInstance failed %x\n", GetLastError());
return hr;
}
hr = cmobj->QueryInterface(IID_IShellExtInit, (void**)&shext);
if (hr != S_OK)
{
- TRACE("Failed to query for interface IID_IShellExtInit\n");
+ ERR("Failed to query for interface IID_IShellExtInit hr %x pClass %s\n", hr, wine_dbgstr_guid(pClass));
cmobj->Release();
return FALSE;
}
shext->Release();
if (hr != S_OK)
{
- TRACE("Failed to initialize shell extension error %x\n", hr);
+ TRACE("Failed to initialize shell extension error %x pClass %s\n", hr, wine_dbgstr_guid(pClass));
cmobj->Release();
return hr;
}
curEntry->Next = NULL;
curEntry->NumIds = 0;
curEntry->CMenu = cmobj;
- memcpy(&curEntry->ClassID, szClass, sizeof(CLSID));
+ memcpy(&curEntry->ClassID, pClass, sizeof(CLSID));
if (dhead)
{
}
else
{
- TRACE("Failed to load string, defaulting to NULL value for mii.dwTypeData\n");
+ ERR("Failed to load string, defaulting to NULL value for mii.dwTypeData\n");
}
}
else
}
else
{
- TRACE("failed to load string %p\n", dwTypeData);
+ ERR("failed to load string %p\n", dwTypeData);
return;
}
}
TRACE("BuildShellItemContextMenu entered\n");
- if (dcm.psf->GetDisplayNameOf(dcm.apidl[0], SHGDN_FORPARSING, &strFile) == S_OK)
+ hr = dcm.psf->GetDisplayNameOf(dcm.apidl[0], SHGDN_FORPARSING, &strFile);
+ if (hr == S_OK)
{
- if (StrRetToBufW(&strFile, dcm.apidl[0], szPath, MAX_PATH) == S_OK)
+ hr = StrRetToBufW(&strFile, dcm.apidl[0], szPath, MAX_PATH);
+ if (hr == S_OK)
{
pOffset = wcsrchr(szPath, L'.');
if (pOffset)
}
}
}
+ else
+ ERR("GetDisplayNameOf failed: %x\n", hr);
guid = _ILGetGUIDPointer(dcm.apidl[0]);
if (guid)
/* add static actions */
rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER;
hr = dcm.psf->GetAttributesOf(dcm.cidl, dcm.apidl, &rfg);
- if (!SUCCEEDED(hr))
+ if (FAILED(hr))
+ {
+ WARN("GetAttributesOf failed: %x\n", hr);
rfg = 0;
+ }
- if (rfg & SFGAO_FOLDER)
+ if ((rfg & SFGAO_FOLDER) || _ILIsControlPanel(dcm.apidl[dcm.cidl]))
{
/* add the default verbs open / explore */
SH_AddStaticEntryForFileClass(L"Folder");
IDefaultContextMenuImpl::DoOpenOrExplore(
LPCMINVOKECOMMANDINFO lpcmi)
{
-
-
+ UNIMPLEMENTED;
return E_FAIL;
}
{
//FIXME path!
ShellExecuteW(NULL, L"open", L"explorer.exe",
- L"/n,::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\::{7007ACC7-3202-11D1-AAD2-00805FC1270E}",
+ L"::{7007ACC7-3202-11D1-AAD2-00805FC1270E}",
NULL, SW_SHOWDEFAULT);
return S_OK;
}
*ppv = NULL;
hr = IDefaultContextMenu_Constructor( pdcm, riid, ppv );
-
+ if (FAILED(hr)) WARN("IDefaultContextMenu_Constructor failed: %x\n", hr);
TRACE("pcm %p hr %x\n", pdcm, hr);
return hr;
}