mirror of
https://github.com/reactos/reactos.git
synced 2024-06-21 13:31:38 +00:00
[SHELL32] Initial SendTo implementation (#2021)
This PR will realize SendTo feature. Initially, there is no file in SendTo folder (displayed as "(None)"). If you added some shortcut files, then SendTo shows some menu items. - Copy, Move, and Link are working. - Added icons. CORE-12562
This commit is contained in:
parent
97d937add1
commit
5308a606dc
|
@ -81,6 +81,7 @@ list(APPEND SOURCE
|
|||
CDefaultContextMenu.cpp
|
||||
COpenWithMenu.cpp
|
||||
CNewMenu.cpp
|
||||
CSendToMenu.cpp
|
||||
CShellDispatch.cpp
|
||||
CFolder.cpp
|
||||
CFolderItems.cpp
|
||||
|
|
520
dll/win32/shell32/CSendToMenu.cpp
Normal file
520
dll/win32/shell32/CSendToMenu.cpp
Normal file
|
@ -0,0 +1,520 @@
|
|||
/*
|
||||
* provides SendTo shell item service
|
||||
*
|
||||
* Copyright 2019 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
|
||||
*
|
||||
* 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 "precomp.h"
|
||||
#define INITGUID
|
||||
#include <guiddef.h>
|
||||
|
||||
#define MAX_ITEM_COUNT 64
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(shell);
|
||||
|
||||
DEFINE_GUID(CLSID_SendToMenu, 0x7BA4C740, 0x9E81, 0x11CF,
|
||||
0x99, 0xD3, 0x00, 0xAA, 0x00, 0x4A, 0xE8, 0x37);
|
||||
|
||||
CSendToMenu::CSendToMenu()
|
||||
: m_hSubMenu(NULL)
|
||||
, m_pItems(NULL)
|
||||
, m_idCmdFirst(0)
|
||||
{
|
||||
SHGetDesktopFolder(&m_pDesktop);
|
||||
m_pSendTo = GetSpecialFolder(NULL, CSIDL_SENDTO);
|
||||
}
|
||||
|
||||
CSendToMenu::~CSendToMenu()
|
||||
{
|
||||
UnloadAllItems();
|
||||
|
||||
if (m_hSubMenu)
|
||||
{
|
||||
DestroyMenu(m_hSubMenu);
|
||||
m_hSubMenu = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
HRESULT CSendToMenu::DoDrop(IDataObject *pDataObject, IDropTarget *pDropTarget)
|
||||
{
|
||||
DWORD dwEffect = DROPEFFECT_MOVE | DROPEFFECT_COPY | DROPEFFECT_LINK;
|
||||
|
||||
BOOL bShift = (GetAsyncKeyState(VK_SHIFT) < 0);
|
||||
BOOL bCtrl = (GetAsyncKeyState(VK_CONTROL) < 0);
|
||||
|
||||
// THIS CODE IS NOT HUMAN-FRIENDLY. SORRY.
|
||||
// (We have to translate a SendTo action to a Drop action)
|
||||
DWORD dwKeyState = MK_LBUTTON;
|
||||
if (bShift && bCtrl)
|
||||
dwKeyState |= MK_SHIFT | MK_CONTROL;
|
||||
else if (!bShift)
|
||||
dwKeyState |= MK_CONTROL;
|
||||
if (bCtrl)
|
||||
dwKeyState |= MK_SHIFT;
|
||||
|
||||
POINTL ptl = { 0, 0 };
|
||||
HRESULT hr = pDropTarget->DragEnter(pDataObject, dwKeyState, ptl, &dwEffect);
|
||||
if (SUCCEEDED(hr) && dwEffect != DROPEFFECT_NONE)
|
||||
{
|
||||
// THIS CODE IS NOT HUMAN-FRIENDLY. SORRY.
|
||||
// (We have to translate a SendTo action to a Drop action)
|
||||
if (bShift && bCtrl)
|
||||
dwEffect = DROPEFFECT_LINK;
|
||||
else if (!bShift)
|
||||
dwEffect = DROPEFFECT_MOVE;
|
||||
else
|
||||
dwEffect = DROPEFFECT_COPY;
|
||||
|
||||
hr = pDropTarget->Drop(pDataObject, dwKeyState, ptl, &dwEffect);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERR("DragEnter: %08lX\n", hr);
|
||||
pDropTarget->DragLeave();
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
// get an IShellFolder from CSIDL
|
||||
IShellFolder *
|
||||
CSendToMenu::GetSpecialFolder(HWND hwnd, int csidl, LPITEMIDLIST *ppidl)
|
||||
{
|
||||
if (ppidl)
|
||||
*ppidl = NULL;
|
||||
|
||||
if (!m_pDesktop)
|
||||
{
|
||||
SHGetDesktopFolder(&m_pDesktop);
|
||||
if (!m_pDesktop)
|
||||
{
|
||||
ERR("SHGetDesktopFolder\n");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
LPITEMIDLIST pidl = NULL;
|
||||
HRESULT hr = SHGetSpecialFolderLocation(hwnd, csidl, &pidl);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
ERR("SHGetSpecialFolderLocation: %08lX\n", hr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
IShellFolder *pFolder = NULL;
|
||||
hr = m_pDesktop->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &pFolder));
|
||||
|
||||
if (ppidl)
|
||||
*ppidl = pidl;
|
||||
else
|
||||
CoTaskMemFree(pidl);
|
||||
|
||||
if (SUCCEEDED(hr))
|
||||
return pFolder;
|
||||
|
||||
ERR("BindToObject: %08lX\n", hr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// get a UI object from PIDL
|
||||
HRESULT CSendToMenu::GetUIObjectFromPidl(HWND hwnd, LPITEMIDLIST pidl,
|
||||
REFIID riid, LPVOID *ppvOut)
|
||||
{
|
||||
*ppvOut = NULL;
|
||||
|
||||
LPCITEMIDLIST pidlLast;
|
||||
CComPtr<IShellFolder> pFolder;
|
||||
HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &pFolder), &pidlLast);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
ERR("SHBindToParent: %08lX\n", hr);
|
||||
return hr;
|
||||
}
|
||||
|
||||
hr = pFolder->GetUIObjectOf(hwnd, 1, &pidlLast, riid, NULL, ppvOut);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
ERR("GetUIObjectOf: %08lX\n", hr);
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
void CSendToMenu::UnloadItem(SENDTO_ITEM *pItem)
|
||||
{
|
||||
if (!pItem)
|
||||
return;
|
||||
|
||||
CoTaskMemFree(pItem->pidlChild);
|
||||
CoTaskMemFree(pItem->pszText);
|
||||
DestroyIcon(pItem->hIcon);
|
||||
HeapFree(GetProcessHeap(), 0, pItem);
|
||||
}
|
||||
|
||||
void CSendToMenu::UnloadAllItems()
|
||||
{
|
||||
SENDTO_ITEM *pItems = m_pItems;
|
||||
m_pItems = NULL;
|
||||
while (pItems)
|
||||
{
|
||||
SENDTO_ITEM *pCurItem = pItems;
|
||||
pItems = pItems->pNext;
|
||||
UnloadItem(pCurItem);
|
||||
}
|
||||
}
|
||||
|
||||
BOOL CSendToMenu::LoadAllItems(HWND hwnd)
|
||||
{
|
||||
UnloadAllItems();
|
||||
|
||||
LPITEMIDLIST pidlSendTo;
|
||||
m_pSendTo = GetSpecialFolder(hwnd, CSIDL_SENDTO, &pidlSendTo);
|
||||
if (!m_pSendTo)
|
||||
{
|
||||
ERR("GetSpecialFolder\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
HRESULT hr;
|
||||
CComPtr<IEnumIDList> pEnumIDList;
|
||||
hr = m_pSendTo->EnumObjects(hwnd,
|
||||
SHCONTF_FOLDERS | SHCONTF_NONFOLDERS,
|
||||
&pEnumIDList);
|
||||
if (FAILED(hr))
|
||||
{
|
||||
ERR("EnumObjects: %08lX\n", hr);
|
||||
ILFree(pidlSendTo);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL bOK = TRUE;
|
||||
LPITEMIDLIST pidlChild;
|
||||
UINT nCount = 0;
|
||||
while (pEnumIDList->Next(1, &pidlChild, NULL) == S_OK)
|
||||
{
|
||||
SENDTO_ITEM *pNewItem = (SENDTO_ITEM *)HeapAlloc(GetProcessHeap(),
|
||||
HEAP_ZERO_MEMORY,
|
||||
sizeof(SENDTO_ITEM));
|
||||
if (!pNewItem)
|
||||
{
|
||||
ERR("HeapAlloc\n");
|
||||
bOK = FALSE;
|
||||
CoTaskMemFree(pidlChild);
|
||||
break;
|
||||
}
|
||||
|
||||
STRRET strret;
|
||||
hr = m_pSendTo->GetDisplayNameOf(pidlChild, SHGDN_NORMAL, &strret);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
LPWSTR pszText = NULL;
|
||||
hr = StrRetToStrW(&strret, pidlChild, &pszText);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
LPITEMIDLIST pidlAbsolute = ILCombine(pidlSendTo, pidlChild);
|
||||
|
||||
SHFILEINFOW fi = { NULL };
|
||||
const UINT uFlags = SHGFI_PIDL | SHGFI_TYPENAME |
|
||||
SHGFI_ICON | SHGFI_SMALLICON;
|
||||
SHGetFileInfoW((LPCWSTR)pidlAbsolute, 0, &fi, sizeof(fi), uFlags);
|
||||
|
||||
ILFree(pidlAbsolute);
|
||||
|
||||
pNewItem->pidlChild = pidlChild;
|
||||
pNewItem->pszText = pszText;
|
||||
pNewItem->hIcon = fi.hIcon;
|
||||
if (m_pItems)
|
||||
{
|
||||
pNewItem->pNext = m_pItems;
|
||||
}
|
||||
m_pItems = pNewItem;
|
||||
|
||||
// successful
|
||||
++nCount;
|
||||
if (nCount >= MAX_ITEM_COUNT)
|
||||
{
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
ERR("StrRetToStrW: %08lX\n", hr);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ERR("GetDisplayNameOf: %08lX\n", hr);
|
||||
}
|
||||
|
||||
UnloadItem(pNewItem);
|
||||
CoTaskMemFree(pidlChild);
|
||||
}
|
||||
|
||||
ILFree(pidlSendTo);
|
||||
|
||||
return bOK;
|
||||
}
|
||||
|
||||
UINT CSendToMenu::InsertSendToItems(HMENU hMenu, UINT idCmdFirst, UINT Pos)
|
||||
{
|
||||
if (m_pItems == NULL)
|
||||
{
|
||||
if (!LoadAllItems(NULL))
|
||||
{
|
||||
ERR("LoadAllItems\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
m_idCmdFirst = idCmdFirst;
|
||||
|
||||
UINT idCmd = idCmdFirst;
|
||||
UINT nCount = 0;
|
||||
for (SENDTO_ITEM *pCurItem = m_pItems; pCurItem; pCurItem = pCurItem->pNext)
|
||||
{
|
||||
const UINT uFlags = MF_BYPOSITION | MF_STRING | MF_ENABLED;
|
||||
if (InsertMenuW(hMenu, Pos, uFlags, idCmd, pCurItem->pszText))
|
||||
{
|
||||
MENUITEMINFOW mii;
|
||||
mii.cbSize = sizeof(mii);
|
||||
mii.fMask = MIIM_DATA | MIIM_BITMAP;
|
||||
mii.dwItemData = (ULONG_PTR)pCurItem;
|
||||
mii.hbmpItem = HBMMENU_CALLBACK;
|
||||
SetMenuItemInfoW(hMenu, idCmd, FALSE, &mii);
|
||||
++idCmd;
|
||||
|
||||
// successful
|
||||
++nCount;
|
||||
if (nCount >= MAX_ITEM_COUNT)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (idCmd == idCmdFirst)
|
||||
{
|
||||
WCHAR szNone[64] = L"(None)";
|
||||
LoadStringW(shell32_hInstance, IDS_NONE, szNone, _countof(szNone));
|
||||
|
||||
AppendMenuW(hMenu, MF_GRAYED | MF_DISABLED | MF_STRING, idCmd, szNone);
|
||||
}
|
||||
|
||||
return idCmd - idCmdFirst;
|
||||
}
|
||||
|
||||
CSendToMenu::SENDTO_ITEM *CSendToMenu::FindItemFromIdOffset(UINT IdOffset)
|
||||
{
|
||||
UINT idCmd = m_idCmdFirst + IdOffset;
|
||||
|
||||
MENUITEMINFOW mii = { sizeof(mii) };
|
||||
mii.fMask = MIIM_DATA;
|
||||
if (GetMenuItemInfoW(m_hSubMenu, idCmd, FALSE, &mii))
|
||||
return (SENDTO_ITEM *)mii.dwItemData;
|
||||
|
||||
ERR("GetMenuItemInfoW\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
HRESULT CSendToMenu::DoSendToItem(SENDTO_ITEM *pItem, LPCMINVOKECOMMANDINFO lpici)
|
||||
{
|
||||
if (!m_pDataObject)
|
||||
{
|
||||
ERR("!m_pDataObject\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
HRESULT hr;
|
||||
CComPtr<IDropTarget> pDropTarget;
|
||||
LPITEMIDLIST pidlChild = pItem->pidlChild;
|
||||
hr = m_pSendTo->GetUIObjectOf(NULL, 1, &pidlChild, IID_IDropTarget,
|
||||
NULL, (LPVOID *)&pDropTarget);
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = DoDrop(m_pDataObject, pDropTarget);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERR("GetUIObjectOf: %08lX\n", hr);
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
STDMETHODIMP CSendToMenu::SetSite(IUnknown *pUnkSite)
|
||||
{
|
||||
m_pSite = pUnkSite;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP CSendToMenu::GetSite(REFIID riid, void **ppvSite)
|
||||
{
|
||||
if (!m_pSite)
|
||||
return E_FAIL;
|
||||
|
||||
return m_pSite->QueryInterface(riid, ppvSite);
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
CSendToMenu::QueryContextMenu(HMENU hMenu,
|
||||
UINT indexMenu,
|
||||
UINT idCmdFirst,
|
||||
UINT idCmdLast,
|
||||
UINT uFlags)
|
||||
{
|
||||
TRACE("%p %p %u %u %u %u\n", this,
|
||||
hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
|
||||
|
||||
WCHAR wszSendTo[64];
|
||||
if (!LoadStringW(shell32_hInstance, IDS_SENDTO,
|
||||
wszSendTo, _countof(wszSendTo)))
|
||||
{
|
||||
ERR("IDS_SENDTO\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
HMENU hSubMenu = CreateMenu();
|
||||
if (!hSubMenu)
|
||||
{
|
||||
ERR("CreateMenu\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
UINT cItems = InsertSendToItems(hSubMenu, idCmdFirst, 0);
|
||||
|
||||
MENUITEMINFOW mii;
|
||||
ZeroMemory(&mii, sizeof(mii));
|
||||
mii.cbSize = sizeof(mii);
|
||||
mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE | MIIM_SUBMENU;
|
||||
mii.fType = MFT_STRING;
|
||||
mii.wID = -1;
|
||||
mii.dwTypeData = wszSendTo;
|
||||
mii.cch = wcslen(mii.dwTypeData);
|
||||
mii.fState = MFS_ENABLED;
|
||||
mii.hSubMenu = hSubMenu;
|
||||
if (!InsertMenuItemW(hMenu, indexMenu, TRUE, &mii))
|
||||
{
|
||||
ERR("InsertMenuItemW\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
HMENU hOldSubMenu = m_hSubMenu;
|
||||
m_hSubMenu = hSubMenu;
|
||||
DestroyMenu(hOldSubMenu);
|
||||
|
||||
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cItems);
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
CSendToMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
|
||||
{
|
||||
HRESULT hr = E_FAIL;
|
||||
|
||||
WORD idCmd = LOWORD(lpici->lpVerb);
|
||||
TRACE("idCmd: %d\n", idCmd);
|
||||
|
||||
SENDTO_ITEM *pItem = FindItemFromIdOffset(idCmd);
|
||||
if (pItem)
|
||||
{
|
||||
hr = DoSendToItem(pItem, lpici);
|
||||
}
|
||||
else
|
||||
{
|
||||
ERR("FindItemFromIdOffset\n");
|
||||
}
|
||||
|
||||
TRACE("CSendToMenu::InvokeCommand %x\n", hr);
|
||||
return hr;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
CSendToMenu::GetCommandString(UINT_PTR idCmd,
|
||||
UINT uType,
|
||||
UINT *pwReserved,
|
||||
LPSTR pszName,
|
||||
UINT cchMax)
|
||||
{
|
||||
FIXME("%p %lu %u %p %p %u\n", this,
|
||||
idCmd, uType, pwReserved, pszName, cchMax);
|
||||
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
CSendToMenu::HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
CSendToMenu::HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam,
|
||||
LRESULT *plResult)
|
||||
{
|
||||
UINT cxSmall = GetSystemMetrics(SM_CXSMICON);
|
||||
UINT cySmall = GetSystemMetrics(SM_CYSMICON);
|
||||
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_MEASUREITEM:
|
||||
{
|
||||
MEASUREITEMSTRUCT* lpmis = reinterpret_cast<MEASUREITEMSTRUCT*>(lParam);
|
||||
if (!lpmis || lpmis->CtlType != ODT_MENU)
|
||||
break;
|
||||
|
||||
UINT cxMenuCheck = GetSystemMetrics(SM_CXMENUCHECK);
|
||||
if (lpmis->itemWidth < cxMenuCheck)
|
||||
lpmis->itemWidth = cxMenuCheck;
|
||||
if (lpmis->itemHeight < cySmall)
|
||||
lpmis->itemHeight = cySmall;
|
||||
|
||||
if (plResult)
|
||||
*plResult = TRUE;
|
||||
break;
|
||||
}
|
||||
case WM_DRAWITEM:
|
||||
{
|
||||
DRAWITEMSTRUCT* lpdis = reinterpret_cast<DRAWITEMSTRUCT*>(lParam);
|
||||
if (!lpdis || lpdis->CtlType != ODT_MENU)
|
||||
break;
|
||||
|
||||
SENDTO_ITEM *pItem = (SENDTO_ITEM *)lpdis->itemData;
|
||||
HICON hIcon = NULL;
|
||||
if (pItem)
|
||||
hIcon = pItem->hIcon;
|
||||
if (!hIcon)
|
||||
break;
|
||||
|
||||
RECT rcItem = lpdis->rcItem;
|
||||
DrawIconEx(lpdis->hDC, 2,
|
||||
lpdis->rcItem.top + (rcItem.bottom - rcItem.top - 16) / 2,
|
||||
hIcon, cxSmall, cySmall, 0, NULL, DI_NORMAL);
|
||||
|
||||
if (plResult)
|
||||
*plResult = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
CSendToMenu::Initialize(PCIDLIST_ABSOLUTE pidlFolder,
|
||||
IDataObject *pdtobj, HKEY hkeyProgID)
|
||||
{
|
||||
m_pDataObject = pdtobj;
|
||||
return S_OK;
|
||||
}
|
99
dll/win32/shell32/CSendToMenu.h
Normal file
99
dll/win32/shell32/CSendToMenu.h
Normal file
|
@ -0,0 +1,99 @@
|
|||
/*
|
||||
* provides new shell item service
|
||||
*
|
||||
* Copyright 2019 Katayama Hirofumi MZ.
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef _SHV_ITEM_SENDTO_H_
|
||||
#define _SHV_ITEM_SENDTO_H_
|
||||
|
||||
extern "C" const GUID CLSID_SendToMenu;
|
||||
|
||||
class CSendToMenu :
|
||||
public CComCoClass<CSendToMenu, &CLSID_SendToMenu>,
|
||||
public CComObjectRootEx<CComMultiThreadModelNoCS>,
|
||||
public IObjectWithSite,
|
||||
public IContextMenu3,
|
||||
public IShellExtInit
|
||||
{
|
||||
private:
|
||||
struct SENDTO_ITEM
|
||||
{
|
||||
LPITEMIDLIST pidlChild;
|
||||
LPWSTR pszText;
|
||||
HICON hIcon;
|
||||
SENDTO_ITEM *pNext;
|
||||
};
|
||||
|
||||
HMENU m_hSubMenu;
|
||||
SENDTO_ITEM *m_pItems;
|
||||
UINT m_idCmdFirst;
|
||||
|
||||
CComPtr<IUnknown> m_pSite;
|
||||
CComPtr<IShellFolder> m_pDesktop;
|
||||
CComPtr<IShellFolder> m_pSendTo;
|
||||
CComPtr<IDataObject> m_pDataObject;
|
||||
|
||||
BOOL LoadAllItems(HWND hwnd);
|
||||
void UnloadItem(SENDTO_ITEM *pItem);
|
||||
void UnloadAllItems();
|
||||
|
||||
UINT InsertSendToItems(HMENU hMenu, UINT idFirst, UINT idMenu);
|
||||
|
||||
SENDTO_ITEM *FindItemFromIdOffset(UINT IdOffset);
|
||||
HRESULT DoSendToItem(SENDTO_ITEM *pItem, LPCMINVOKECOMMANDINFO lpici);
|
||||
|
||||
HRESULT DoDrop(IDataObject *pDataObject, IDropTarget *pDropTarget);
|
||||
IShellFolder *GetSpecialFolder(HWND hwnd, int csidl, LPITEMIDLIST *ppidl = NULL);
|
||||
HRESULT GetUIObjectFromPidl(HWND hwnd, LPITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut);
|
||||
|
||||
public:
|
||||
CSendToMenu();
|
||||
~CSendToMenu();
|
||||
|
||||
// IObjectWithSite
|
||||
STDMETHODIMP SetSite(IUnknown *pUnkSite);
|
||||
STDMETHODIMP GetSite(REFIID riid, void **ppvSite);
|
||||
|
||||
// IContextMenu
|
||||
STDMETHODIMP QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
|
||||
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
|
||||
STDMETHODIMP GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen);
|
||||
|
||||
// IContextMenu3
|
||||
STDMETHODIMP HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult);
|
||||
|
||||
// IContextMenu2
|
||||
STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
// IShellExtInit
|
||||
STDMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID);
|
||||
|
||||
DECLARE_REGISTRY_RESOURCEID(IDR_SENDTOMENU)
|
||||
DECLARE_NOT_AGGREGATABLE(CSendToMenu)
|
||||
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
||||
|
||||
BEGIN_COM_MAP(CSendToMenu)
|
||||
COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
|
||||
COM_INTERFACE_ENTRY_IID(IID_IContextMenu3, IContextMenu3)
|
||||
COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2)
|
||||
COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
|
||||
COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit)
|
||||
END_COM_MAP()
|
||||
};
|
||||
|
||||
#endif /* _SHV_ITEM_SENDTO_H_ */
|
|
@ -873,6 +873,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Папка"
|
||||
|
|
|
@ -815,7 +815,7 @@ BEGIN
|
|||
IDS_FAVORITES "Favorites"
|
||||
IDS_STARTUP "Start Menu\\Programs\\StartUp"
|
||||
IDS_RECENT "Recent"
|
||||
IDS_SENDTO "SendTo"
|
||||
IDS_SENDTO "Se&nd To"
|
||||
IDS_STARTMENU "Start Menu"
|
||||
IDS_MYMUSIC "My Music"
|
||||
IDS_MYVIDEO "My Videos"
|
||||
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Folder"
|
||||
|
|
|
@ -821,7 +821,7 @@ BEGIN
|
|||
IDS_FAVORITES "Oblíbené"
|
||||
IDS_STARTUP "Nabídka Start\\Programy\\Po spuštění"
|
||||
IDS_RECENT "Poslední dokumenty"
|
||||
IDS_SENDTO "SendTo"
|
||||
IDS_SENDTO "Se&nd To"
|
||||
IDS_STARTMENU "Nabídka Start"
|
||||
IDS_MYMUSIC "Hudba"
|
||||
IDS_MYVIDEO "Filmy"
|
||||
|
@ -878,6 +878,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Složka"
|
||||
|
|
|
@ -878,6 +878,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Folder"
|
||||
|
|
|
@ -873,6 +873,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Auswerfen des Mediums nicht möglich (Fehlercode: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Anzeigen der Eigenschaften nicht möglich (Fehlercode: %lu)."
|
||||
IDS_CANTDISCONNECT "Trennen nicht möglich (Fehlercode: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Dateiordner"
|
||||
|
|
|
@ -815,7 +815,7 @@ BEGIN
|
|||
IDS_FAVORITES "Favorites"
|
||||
IDS_STARTUP "Start Menu\\Programs\\StartUp"
|
||||
IDS_RECENT "Recent"
|
||||
IDS_SENDTO "SendTo"
|
||||
IDS_SENDTO "Se&nd To"
|
||||
IDS_STARTMENU "Start Menu"
|
||||
IDS_MYMUSIC "My Music"
|
||||
IDS_MYVIDEO "My Videos"
|
||||
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Folder"
|
||||
|
|
|
@ -815,7 +815,7 @@ BEGIN
|
|||
IDS_FAVORITES "Favorites"
|
||||
IDS_STARTUP "Start Menu\\Programs\\StartUp"
|
||||
IDS_RECENT "Recent"
|
||||
IDS_SENDTO "SendTo"
|
||||
IDS_SENDTO "Se&nd To"
|
||||
IDS_STARTMENU "Start Menu"
|
||||
IDS_MYMUSIC "My Music"
|
||||
IDS_MYVIDEO "My Videos"
|
||||
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Folder"
|
||||
|
|
|
@ -815,7 +815,7 @@ BEGIN
|
|||
IDS_FAVORITES "Favorites"
|
||||
IDS_STARTUP "Start Menu\\Programs\\StartUp"
|
||||
IDS_RECENT "Recent"
|
||||
IDS_SENDTO "SendTo"
|
||||
IDS_SENDTO "Se&nd To"
|
||||
IDS_STARTMENU "Start Menu"
|
||||
IDS_MYMUSIC "My Music"
|
||||
IDS_MYVIDEO "My Videos"
|
||||
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Folder"
|
||||
|
|
|
@ -880,6 +880,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "No se pudo extraer la unidad (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "No se puede mostrar las propiedades (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "No se pudo desconectar (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Directorio"
|
||||
|
|
|
@ -822,7 +822,7 @@ BEGIN
|
|||
IDS_FAVORITES "Lemmikud"
|
||||
IDS_STARTUP "Start Menu\\Programs\\StartUp"
|
||||
IDS_RECENT "Hiljutised"
|
||||
IDS_SENDTO "SendTo"
|
||||
IDS_SENDTO "Se&nd To"
|
||||
IDS_STARTMENU "Start Menüü"
|
||||
IDS_MYMUSIC "Minu muusika"
|
||||
IDS_MYVIDEO "Minu videod"
|
||||
|
@ -879,6 +879,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Ei saa meediumit väljutada (Veateade: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Ei saa atribuute näidata (Veateade: %lu)."
|
||||
IDS_CANTDISCONNECT "Ei saa lahti ühendada (Veateade: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Kaust"
|
||||
|
|
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Folder"
|
||||
|
|
|
@ -815,7 +815,7 @@ BEGIN
|
|||
IDS_FAVORITES "Favoris"
|
||||
IDS_STARTUP "Menu Démarrer\\Programmes\\Démarrage"
|
||||
IDS_RECENT "Recent"
|
||||
IDS_SENDTO "SendTo"
|
||||
IDS_SENDTO "Se&nd To"
|
||||
IDS_STARTMENU "Menu Démarrer"
|
||||
IDS_MYMUSIC "Ma musique"
|
||||
IDS_MYVIDEO "Mes vidéos"
|
||||
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Impossible d'éjecter le média (code d'erreur : %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Impossible de montrer les propriétés (code d'erreur : %lu)."
|
||||
IDS_CANTDISCONNECT "Impossible de déconnecter (code d'erreur : %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Dossier"
|
||||
|
|
|
@ -874,6 +874,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "תיקיה"
|
||||
|
|
|
@ -867,6 +867,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "मीडिया को इजेक्ट करने में असमर्थ (एरर कोड: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "गुण दिखाने में असमर्थ (एरर कोड: %lu)."
|
||||
IDS_CANTDISCONNECT "डिस्कनेक्ट करने में असमर्थ (एरर कोड: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "फोल्डर"
|
||||
|
|
|
@ -815,7 +815,7 @@ BEGIN
|
|||
IDS_FAVORITES "Kedvencek"
|
||||
IDS_STARTUP "Start Menu\\Programs\\Automatikus indítás" /* MS style: Indítópult */
|
||||
IDS_RECENT "Recent"
|
||||
IDS_SENDTO "SendTo"
|
||||
IDS_SENDTO "Se&nd To"
|
||||
IDS_STARTMENU "Start Menu"
|
||||
IDS_MYMUSIC "Zenék"
|
||||
IDS_MYVIDEO "Videók"
|
||||
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Folder"
|
||||
|
|
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Tidak bisa mengeluarkan media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Tidak bisa menampilkan properti (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Tidak bisa memutuskan (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Folder"
|
||||
|
|
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Cartella"
|
||||
|
|
|
@ -812,7 +812,7 @@ BEGIN
|
|||
IDS_FAVORITES "Favorites"
|
||||
IDS_STARTUP "スタート メニュー\\プログラム\\スタートアップ"
|
||||
IDS_RECENT "Recent"
|
||||
IDS_SENDTO "SendTo"
|
||||
IDS_SENDTO "送る(&N)"
|
||||
IDS_STARTMENU "スタート メニュー"
|
||||
IDS_MYMUSIC "My Music"
|
||||
IDS_MYVIDEO "My Videos"
|
||||
|
@ -869,6 +869,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "フォルダ"
|
||||
|
|
|
@ -815,7 +815,7 @@ BEGIN
|
|||
IDS_FAVORITES "Favorites"
|
||||
IDS_STARTUP "Start Menu\\Programs\\StartUp"
|
||||
IDS_RECENT "Recent"
|
||||
IDS_SENDTO "SendTo"
|
||||
IDS_SENDTO "Se&nd To"
|
||||
IDS_STARTMENU "Start Menu"
|
||||
IDS_MYMUSIC "My Music"
|
||||
IDS_MYVIDEO "My Videos"
|
||||
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Folder"
|
||||
|
|
|
@ -815,7 +815,7 @@ BEGIN
|
|||
IDS_FAVORITES "Favorites"
|
||||
IDS_STARTUP "Start Menu\\Programs\\StartUp"
|
||||
IDS_RECENT "Recent"
|
||||
IDS_SENDTO "SendTo"
|
||||
IDS_SENDTO "Se&nd To"
|
||||
IDS_STARTMENU "Start Menu"
|
||||
IDS_MYMUSIC "My Music"
|
||||
IDS_MYVIDEO "My Videos"
|
||||
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Folder"
|
||||
|
|
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Mappe"
|
||||
|
|
|
@ -877,6 +877,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Nie można wysunąć nośnika (kod błędu: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Nie można pokazać właściwości (kod błędu: %lu)."
|
||||
IDS_CANTDISCONNECT "Nie można odłączyć (kod błędu: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Katalog"
|
||||
|
|
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Pasta"
|
||||
|
|
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Pasta"
|
||||
|
|
|
@ -874,6 +874,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Eșec la scoaterea mediului de stocare (Cod de eroare: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Eșec la inspecția proprietăților (Cod de eroare: %lu)."
|
||||
IDS_CANTDISCONNECT "Eșec la deconectare (Cod de eroare: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Dosar"
|
||||
|
|
|
@ -879,6 +879,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Не удалось извлечь носитель (код ошибки: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Не удалось вывести свойства (код ошибки: %lu)."
|
||||
IDS_CANTDISCONNECT "Не удалось отсоединить сетевой диск (код ошибки: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Папка с файлами"
|
||||
|
|
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Priečinok"
|
||||
|
|
|
@ -815,7 +815,7 @@ BEGIN
|
|||
IDS_FAVORITES "Favorites"
|
||||
IDS_STARTUP "Start Menu\\Programs\\StartUp"
|
||||
IDS_RECENT "Recent"
|
||||
IDS_SENDTO "SendTo"
|
||||
IDS_SENDTO "Se&nd To"
|
||||
IDS_STARTMENU "Start Menu"
|
||||
IDS_MYMUSIC "My Music"
|
||||
IDS_MYVIDEO "My Videos"
|
||||
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Folder"
|
||||
|
|
|
@ -876,6 +876,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Dosje"
|
||||
|
|
|
@ -815,7 +815,7 @@ BEGIN
|
|||
IDS_FAVORITES "Favoriter"
|
||||
IDS_STARTUP "Start-meny\\Program\\Autostart"
|
||||
IDS_RECENT "Tidigare"
|
||||
IDS_SENDTO "SendTo"
|
||||
IDS_SENDTO "Se&nd To"
|
||||
IDS_STARTMENU "Start-meny"
|
||||
IDS_MYMUSIC "Min musik"
|
||||
IDS_MYVIDEO "Mina videoklipp"
|
||||
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Mapp"
|
||||
|
|
|
@ -874,6 +874,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Unable to eject media (Error Code: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Unable to show properties (Error Code: %lu)."
|
||||
IDS_CANTDISCONNECT "Unable to disconnect (Error Code: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Dizin"
|
||||
|
|
|
@ -872,6 +872,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "Не вдалось відключити носій (код помилки: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "Не вдалось відкрити властивості (код помилки: %lu)."
|
||||
IDS_CANTDISCONNECT "Не вдалось відключити (код помилки: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "Папка"
|
||||
|
|
|
@ -825,7 +825,7 @@ BEGIN
|
|||
IDS_FAVORITES "收藏夹"
|
||||
IDS_STARTUP "「开始」菜单\\程序\\启动"
|
||||
IDS_RECENT "Recent"
|
||||
IDS_SENDTO "SendTo"
|
||||
IDS_SENDTO "Se&nd To"
|
||||
IDS_STARTMENU "「开始」菜单"
|
||||
IDS_MYMUSIC "我的音乐"
|
||||
IDS_MYVIDEO "我的视频"
|
||||
|
@ -882,6 +882,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "无法弹出媒体 (错误代码: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "无法显示属性 (错误代码: %lu)."
|
||||
IDS_CANTDISCONNECT "无法断开连接 (错误代码: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "文件夹"
|
||||
|
|
|
@ -826,7 +826,7 @@ BEGIN
|
|||
IDS_FAVORITES "我的最愛"
|
||||
IDS_STARTUP "「開始」功能表\\程式\\啟動"
|
||||
IDS_RECENT "Recent"
|
||||
IDS_SENDTO "SendTo"
|
||||
IDS_SENDTO "Se&nd To"
|
||||
IDS_STARTMENU "「開始」功能表"
|
||||
IDS_MYMUSIC "我的音樂"
|
||||
IDS_MYVIDEO "我的影片"
|
||||
|
@ -883,6 +883,7 @@ BEGIN
|
|||
IDS_CANTEJECTMEDIA "無法退出媒體 (錯誤碼: %lu)."
|
||||
IDS_CANTSHOWPROPERTIES "無法顯示內容 (錯誤碼: %lu)."
|
||||
IDS_CANTDISCONNECT "無法中斷 (錯誤碼: %lu)."
|
||||
IDS_NONE "(None)"
|
||||
|
||||
/* Friendly File Type Names */
|
||||
IDS_DIRECTORY "資料夾"
|
||||
|
|
|
@ -80,6 +80,7 @@
|
|||
#include "droptargets/CFSDropTarget.h"
|
||||
#include "COpenWithMenu.h"
|
||||
#include "CNewMenu.h"
|
||||
#include "CSendToMenu.h"
|
||||
#include "dialogs/filedefext.h"
|
||||
#include "dialogs/drvdefext.h"
|
||||
#include "CQueryAssociations.h"
|
||||
|
|
26
dll/win32/shell32/res/rgs/sendtomenu.rgs
Normal file
26
dll/win32/shell32/res/rgs/sendtomenu.rgs
Normal file
|
@ -0,0 +1,26 @@
|
|||
HKCR
|
||||
{
|
||||
NoRemove CLSID
|
||||
{
|
||||
ForceRemove {7BA4C740-9E81-11CF-99D3-00AA004AE837} = s 'ReactOS SendTo Object Service'
|
||||
{
|
||||
val flags = d '1'
|
||||
InprocServer32 = s '%MODULE%'
|
||||
{
|
||||
val ThreadingModel = s 'Apartment'
|
||||
}
|
||||
}
|
||||
}
|
||||
NoRemove AllFilesystemObjects
|
||||
{
|
||||
NoRemove shellex
|
||||
{
|
||||
NoRemove ContextMenuHandlers
|
||||
{
|
||||
ForceRemove SendTo = s '{7BA4C740-9E81-11CF-99D3-00AA004AE837}'
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -29,3 +29,4 @@ IDR_REBARBANDSITE REGISTRY "res/rgs/rebarbandsite.rgs"
|
|||
IDR_USERNOTIFICATION REGISTRY "res/rgs/usernotification.rgs"
|
||||
IDR_SHELL REGISTRY "res/rgs/shell.rgs"
|
||||
IDR_ACTIVEDESKTOP REGISTRY "res/rgs/activedesktop.rgs"
|
||||
IDR_SENDTOMENU REGISTRY "res/rgs/sendtomenu.rgs"
|
||||
|
|
|
@ -289,6 +289,7 @@ BEGIN_OBJECT_MAP(ObjectMap)
|
|||
OBJECT_ENTRY(CLSID_RecycleBin, CRecycleBin)
|
||||
OBJECT_ENTRY(CLSID_OpenWithMenu, COpenWithMenu)
|
||||
OBJECT_ENTRY(CLSID_NewMenu, CNewMenu)
|
||||
OBJECT_ENTRY(CLSID_SendToMenu, CSendToMenu)
|
||||
OBJECT_ENTRY(CLSID_StartMenu, CStartMenuDummy)
|
||||
OBJECT_ENTRY(CLSID_MenuBandSite, CMenuSite)
|
||||
OBJECT_ENTRY(CLSID_MenuBand, CMenuBand)
|
||||
|
|
|
@ -140,6 +140,7 @@
|
|||
#define IDS_CANTEJECTMEDIA 158
|
||||
#define IDS_CANTSHOWPROPERTIES 159
|
||||
#define IDS_CANTDISCONNECT 160
|
||||
#define IDS_NONE 161
|
||||
|
||||
/* Friendly File Type Names */
|
||||
#define IDS_DIRECTORY 200
|
||||
|
@ -811,3 +812,4 @@
|
|||
#define IDR_USERNOTIFICATION 155
|
||||
#define IDR_SHELL 156
|
||||
#define IDR_ACTIVEDESKTOP 157
|
||||
#define IDR_SENDTOMENU 158
|
||||
|
|
Loading…
Reference in a new issue