- start implementing "Open With" shell extension

- see http://windowsxp.mvps.org/OpenWith.htm

svn path=/trunk/; revision=29921
This commit is contained in:
Johannes Anderwald 2007-10-27 20:09:38 +00:00
parent 7794642aa9
commit 2a3cd64f08
35 changed files with 382 additions and 2 deletions

View file

@ -412,4 +412,7 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -412,4 +412,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -413,4 +413,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -412,4 +412,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -413,4 +413,6 @@ BEGIN
IDS_DRIVE_FIXED "Lokaler Datenträger"
IDS_DRIVE_CDROM "CD-Laufwerk"
IDS_DRIVE_NETWORK "Netzlaufwerk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -412,4 +412,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -412,4 +412,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -413,4 +413,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -412,4 +412,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -415,4 +415,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -415,4 +415,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -413,4 +413,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -412,4 +412,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -412,4 +412,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -412,4 +412,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -412,4 +412,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -413,4 +413,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -414,4 +414,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -414,4 +414,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -413,4 +413,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -412,4 +412,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Choose Program..."
END

View file

@ -412,4 +412,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Select Program"
END

View file

@ -412,4 +412,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Select Program"
END

View file

@ -412,4 +412,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Select Program"
END

View file

@ -412,4 +412,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Select Program"
END

View file

@ -412,4 +412,6 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Select Program"
END

View file

@ -413,6 +413,8 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Select Program"
END
#pragma code_page(default)

View file

@ -412,6 +412,8 @@ BEGIN
IDS_DRIVE_FIXED "Local Disk"
IDS_DRIVE_CDROM "CDROM"
IDS_DRIVE_NETWORK "Network Disk"
IDS_OPEN_WITH "Open With"
IDS_OPEN_WITH_CHOOSE "Select Program"
END
#pragma code_page(default)

View file

@ -0,0 +1,315 @@
/*
* IContextMenu for items in the shellview
*
* Copyright 1998, 2000 Juergen Schmied <juergen.schmied@debitel.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <string.h>
#define COBJMACROS
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
#define YDEBUG
#include "winerror.h"
#include "wine/debug.h"
#include "windef.h"
#include "wingdi.h"
#include "pidl.h"
#include "undocshell.h"
#include "shlobj.h"
#include "objbase.h"
#include "shell32_main.h"
#include "shellfolder.h"
#include "shresdef.h"
const GUID CLSID_OpenWith = { 0x09799AFB, 0xAD67, 0x11d1, {0xAB,0xCD,0x00,0xC0,0x4F,0xC3,0x09,0x36} };
typedef struct
{
const IContextMenu2Vtbl *lpVtblContextMenu;
const IShellExtInitVtbl *lpvtblShellExtInit;
LONG wId;
volatile LONG ref;
} SHEOWImpl;
static const IShellExtInitVtbl eivt;
static const IContextMenu2Vtbl cmvt;
static HRESULT WINAPI SHEOWCm_fnQueryInterface(IContextMenu2 *iface, REFIID riid, LPVOID *ppvObj);
static ULONG WINAPI SHEOWCm_fnRelease(IContextMenu2 *iface);
HRESULT WINAPI SHEOW_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv)
{
SHEOWImpl * ow;
HRESULT res;
ow = LocalAlloc(LMEM_ZEROINIT, sizeof(SHEOWImpl));
if (!ow)
{
return E_OUTOFMEMORY;
}
ow->ref = 1;
ow->lpVtblContextMenu = &cmvt;
ow->lpvtblShellExtInit = &eivt;
TRACE("(%p)->()\n",ow);
res = SHEOWCm_fnQueryInterface( (IContextMenu2*)&ow->lpVtblContextMenu, riid, ppv );
SHEOWCm_fnRelease( (IContextMenu2*)&ow->lpVtblContextMenu );
return res;
}
static inline SHEOWImpl *impl_from_IShellExtInit( IShellExtInit *iface )
{
return (SHEOWImpl *)((char*)iface - FIELD_OFFSET(SHEOWImpl, lpvtblShellExtInit));
}
static inline SHEOWImpl *impl_from_IContextMenu( IContextMenu2 *iface )
{
return (SHEOWImpl *)((char*)iface - FIELD_OFFSET(SHEOWImpl, lpVtblContextMenu));
}
static HRESULT WINAPI SHEOWCm_fnQueryInterface(IContextMenu2 *iface, REFIID riid, LPVOID *ppvObj)
{
SHEOWImpl *This = impl_from_IContextMenu(iface);
TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
*ppvObj = NULL;
if(IsEqualIID(riid, &IID_IUnknown) ||
IsEqualIID(riid, &IID_IContextMenu) ||
IsEqualIID(riid, &IID_IContextMenu2))
{
*ppvObj = &This->lpVtblContextMenu;
}
else if(IsEqualIID(riid, &IID_IShellExtInit))
{
*ppvObj = &This->lpvtblShellExtInit;
}
if(*ppvObj)
{
IUnknown_AddRef((IUnknown*)*ppvObj);
TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
return S_OK;
}
TRACE("-- Interface: E_NOINTERFACE\n");
return E_NOINTERFACE;
}
static ULONG WINAPI SHEOWCm_fnAddRef(IContextMenu2 *iface)
{
SHEOWImpl *This = impl_from_IContextMenu(iface);
ULONG refCount = InterlockedIncrement(&This->ref);
TRACE("(%p)->(count=%u)\n", This, refCount - 1);
return refCount;
}
static ULONG WINAPI SHEOWCm_fnRelease(IContextMenu2 *iface)
{
SHEOWImpl *This = impl_from_IContextMenu(iface);
ULONG refCount = InterlockedDecrement(&This->ref);
TRACE("(%p)->(count=%i)\n", This, refCount + 1);
if (!refCount)
{
TRACE(" destroying IContextMenu(%p)\n",This);
HeapFree(GetProcessHeap(),0,This);
}
return refCount;
}
static UINT
AddItems(SHEOWImpl *This, HMENU hMenu, UINT idCmdFirst)
{
UINT count = 0;
MENUITEMINFOW mii;
WCHAR szBuffer[50];
static const WCHAR szChoose[] = { 'C','h','o','o','s','e',' ','P','r','o','g','r','a','m','.','.','.',0 };
ZeroMemory(&mii, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE;
mii.fType = MFT_STRING;
mii.fState = MFS_ENABLED;
mii.wID = idCmdFirst;
if (!LoadStringW(shell32_hInstance, IDS_OPEN_WITH_CHOOSE, szBuffer, sizeof(szBuffer) / sizeof(WCHAR)))
{
ERR("Failed to load string\n");
wcscpy(szBuffer, szChoose);
}
mii.dwItemData = (LPWSTR)szBuffer;
if (InsertMenuItemW(hMenu, 0, TRUE, &mii))
count++;
return count;
}
static HRESULT WINAPI SHEOWCm_fnQueryContextMenu(
IContextMenu2 *iface,
HMENU hmenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags)
{
MENUITEMINFOW mii;
USHORT items = 0;
WCHAR szBuffer[100];
HMENU hSubMenu = NULL;
SHEOWImpl *This = impl_from_IContextMenu(iface);
if (LoadStringW(shell32_hInstance, IDS_OPEN_WITH, szBuffer, 100) < 0)
{
TRACE("failed to load string\n");
return E_FAIL;
}
hSubMenu = CreatePopupMenu();
if (hSubMenu == NULL)
{
ERR("failed to create submenu");
return E_FAIL;
}
items = AddItems(This, hSubMenu, idCmdFirst);
ZeroMemory(&mii, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE;
if (hSubMenu)
{
mii.fMask |= MIIM_SUBMENU;
mii.hSubMenu = hSubMenu;
}
mii.dwTypeData = (LPWSTR) szBuffer;
mii.fState = MFS_ENABLED;
mii.wID = idCmdFirst + items;
mii.fType = MFT_STRING;
if (InsertMenuItemW( hmenu, 0, TRUE, &mii))
items++;
TRACE("items %x\n",items);
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, items);
}
static HRESULT WINAPI
SHEOWCm_fnInvokeCommand( IContextMenu2* iface, LPCMINVOKECOMMANDINFO lpici )
{
SHEOWImpl *This = impl_from_IContextMenu(iface);
TRACE("This %p\n", This);
return E_FAIL;
}
static HRESULT WINAPI
SHEOWCm_fnGetCommandString( IContextMenu2* iface, UINT_PTR idCmd, UINT uType,
UINT* pwReserved, LPSTR pszName, UINT cchMax )
{
SHEOWImpl *This = impl_from_IContextMenu(iface);
FIXME("%p %lu %u %p %p %u\n", This,
idCmd, uType, pwReserved, pszName, cchMax );
return E_NOTIMPL;
}
static HRESULT WINAPI SHEOWCm_fnHandleMenuMsg(
IContextMenu2 *iface,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
SHEOWImpl *This = impl_from_IContextMenu(iface);
TRACE("This %p uMsg %x\n",This, uMsg);
return E_NOTIMPL;
}
static const IContextMenu2Vtbl cmvt =
{
SHEOWCm_fnQueryInterface,
SHEOWCm_fnAddRef,
SHEOWCm_fnRelease,
SHEOWCm_fnQueryContextMenu,
SHEOWCm_fnInvokeCommand,
SHEOWCm_fnGetCommandString,
SHEOWCm_fnHandleMenuMsg
};
static HRESULT WINAPI
SHEOW_ExtInit_Initialize( IShellExtInit* iface, LPCITEMIDLIST pidlFolder,
IDataObject *pdtobj, HKEY hkeyProgID )
{
SHEOWImpl *This = impl_from_IShellExtInit(iface);
TRACE("This %p\n", This);
return S_OK;
}
static ULONG WINAPI SHEOW_ExtInit_AddRef(IShellExtInit *iface)
{
SHEOWImpl *This = impl_from_IShellExtInit(iface);
ULONG refCount = InterlockedIncrement(&This->ref);
TRACE("(%p)->(count=%u)\n", This, refCount - 1);
return refCount;
}
static ULONG WINAPI SHEOW_ExtInit_Release(IShellExtInit *iface)
{
SHEOWImpl *This = impl_from_IShellExtInit(iface);
ULONG refCount = InterlockedDecrement(&This->ref);
TRACE("(%p)->(count=%i)\n", This, refCount + 1);
if (!refCount)
{
HeapFree(GetProcessHeap(),0,This);
}
return refCount;
}
static HRESULT WINAPI
SHEOW_ExtInit_QueryInterface( IShellExtInit* iface, REFIID riid, void** ppvObject )
{
SHEOWImpl *This = impl_from_IShellExtInit(iface);
return SHEOWCm_fnQueryInterface((IContextMenu2*)This, riid, ppvObject);
}
static const IShellExtInitVtbl eivt =
{
SHEOW_ExtInit_QueryInterface,
SHEOW_ExtInit_AddRef,
SHEOW_ExtInit_Release,
SHEOW_ExtInit_Initialize
};

View file

@ -69,4 +69,5 @@
<file>fprop.c</file>
<file>drive.c</file>
<file>recyclebin.c</file>
<file>she_ocmenu.c</file>
</module>

View file

@ -100,6 +100,7 @@ HRESULT WINAPI UnixDosFolder_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVO
HRESULT WINAPI FolderShortcut_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv);
HRESULT WINAPI MyDocuments_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv);
HRESULT WINAPI RecycleBin_Constructor(IUnknown * pUnkOuter, REFIID riif, LPVOID *ppv);
HRESULT WINAPI SHEOW_Constructor(IUnknown * pUnkOuter, REFIID riif, LPVOID *ppv);
HRESULT WINAPI ShellFSFolder_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv);
extern HRESULT CPanel_GetIconLocationW(LPCITEMIDLIST, LPWSTR, UINT, int*);
HRESULT WINAPI CPanel_ExtractIconA(LPITEMIDLIST pidl, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize);

View file

@ -77,6 +77,7 @@ static const struct {
#endif
{&CLSID_Printers, &ISF_Printers_Constructor},
{&CLSID_RecycleBin, &RecycleBin_Constructor},
{&CLSID_OpenWith, &SHEOW_Constructor},
{NULL,NULL}
};

View file

@ -96,6 +96,8 @@
#define IDS_TRASHMULTIPLE_TEXT 139
#define IDS_CANTTRASH_TEXT 140
#define IDS_OVERWRITEFOLDER_TEXT 141
#define IDS_OPEN_WITH 142
#define IDS_OPEN_WITH_CHOOSE 143
/* Note: this string is referenced from the registry*/
#define IDS_RECYCLEBIN_FOLDER_NAME 8964

View file

@ -23,7 +23,7 @@
#define COBJMACROS
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
//#define YDEBUG
#define YDEBUG
#include "winerror.h"
#include "wine/debug.h"
@ -378,9 +378,10 @@ static HRESULT WINAPI ISvItemCm_fnQueryContextMenu(
if(!(uFlags & CMF_EXPLORE))
_InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_OPEN, MFT_STRING, "&Select", MFS_ENABLED);
TRACE("rfg %x\n", This->rfg);
if (This->rfg & SFGAO_BROWSABLE)
{
if(This->bAllValues)
if(This->bAllValues)
{
_InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_OPEN, MFT_STRING, "&Open", MFS_ENABLED);
_InsertMenuItem(hmenu, indexMenu++, TRUE, FCIDM_SHVIEW_EXPLORE, MFT_STRING, "&Explore", MFS_ENABLED);

View file

@ -560,6 +560,8 @@ DWORD WINAPI CheckEscapesW(LPWSTR string, DWORD len);
/* policy functions */
BOOL WINAPI SHInitRestricted(LPCVOID unused, LPCVOID inpRegKey);
DEFINE_GUID(CLSID_OpenWith, 0x09799AFB, 0xAD67, 0x11d1, 0xAB,0xCD,0x00,0xC0,0x4F,0xC3,0x09,0x36);
#ifdef __cplusplus
} /* extern "C" */
#endif /* defined(__cplusplus) */