[SHELL32] Copy as path shell extension (#6701)

* Added Copy as path menu extension

---------

Co-authored-by: Thamatip Chitpong <weedgamer131@gmail.com>
This commit is contained in:
Whindmar Saksit 2024-04-06 23:01:32 +02:00 committed by GitHub
parent 91be8bf0a1
commit 9238a1762f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
43 changed files with 243 additions and 0 deletions

View file

@ -436,3 +436,145 @@ CCopyMoveToMenu::GetSite(REFIID riid, void **ppvSite)
return m_pSite->QueryInterface(riid, ppvSite);
}
static DWORD
SetClipboard(UINT cf, const void* data, SIZE_T size)
{
BOOL succ = FALSE;
HGLOBAL handle = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, size);
if (handle)
{
LPVOID clipdata = GlobalLock(handle);
if (clipdata)
{
CopyMemory(clipdata, data, size);
GlobalUnlock(handle);
if (OpenClipboard(NULL))
{
EmptyClipboard();
succ = SetClipboardData(cf, handle) != NULL;
CloseClipboard();
}
}
if (!succ)
{
GlobalFree(handle);
}
}
return succ ? ERROR_SUCCESS : GetLastError();
}
static DWORD
SetClipboardFromString(LPCWSTR str)
{
SIZE_T cch = lstrlenW(str) + 1, size = cch * sizeof(WCHAR);
if (size > cch)
return SetClipboard(CF_UNICODETEXT, str, size);
else
return ERROR_BUFFER_OVERFLOW;
}
static void
AppendToPathList(CStringW &paths, LPCWSTR path, DWORD index)
{
if (index)
paths += L"\r\n";
LPCWSTR quote = StrChrW(path, L' ');
if (quote)
paths += L'\"';
paths += path;
if (quote)
paths += L'\"';
}
STDMETHODIMP
CCopyAsPathMenu::Drop(IDataObject *pdto, DWORD grfKeyState, POINTL ptl, DWORD *pdwEffect)
{
CStringW paths;
DWORD i, count;
#if 0
CComPtr<IShellItemArray> array;
HRESULT hr = SHCreateShellItemArrayFromDataObject(pdto, IID_PPV_ARG(IShellItemArray, &array));
if (SUCCEEDED(hr))
{
for (i = 0, array->GetCount(&count); i < count && SUCCEEDED(hr); ++i)
{
CComPtr<IShellItem> item;
hr = array->GetItemAt(i, &item);
if (SUCCEEDED(hr))
{
CComHeapPtr<WCHAR> path;
hr = item->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &path);
if (SUCCEEDED(hr))
{
AppendToPathList(paths, path, i);
}
}
}
}
#else
FIXME("Implement and use SHCreateShellItemArrayFromDataObject\n");
CDataObjectHIDA pCIDA(pdto);
HRESULT hr = pCIDA.hr();
if (SUCCEEDED(hr))
{
for (i = 0, count = pCIDA->cidl; i < count && SUCCEEDED(hr); ++i)
{
PCUIDLIST_ABSOLUTE folder = HIDA_GetPIDLFolder(pCIDA);
PCUIDLIST_RELATIVE item = HIDA_GetPIDLItem(pCIDA, i);
CComHeapPtr<ITEMIDLIST> full;
hr = SHILCombine(folder, item, &full);
if (SUCCEEDED(hr))
{
PCUITEMID_CHILD child;
CComPtr<IShellFolder> sf;
hr = SHBindToParent(full, IID_PPV_ARG(IShellFolder, &sf), &child);
if (SUCCEEDED(hr))
{
STRRET strret;
hr = sf->GetDisplayNameOf(child, SHGDN_FORPARSING, &strret);
if (SUCCEEDED(hr))
{
CComHeapPtr<WCHAR> path;
hr = StrRetToStrW(&strret, child, &path);
if (SUCCEEDED(hr))
{
AppendToPathList(paths, path, i);
}
}
}
}
}
}
else
{
FORMATETC fmte = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stgm;
hr = pdto->GetData(&fmte, &stgm);
if (SUCCEEDED(hr))
{
for (i = 0, count = DragQueryFileW((HDROP)stgm.hGlobal, -1, NULL, 0); i < count && SUCCEEDED(hr); ++i)
{
WCHAR path[MAX_PATH];
if (DragQueryFileW((HDROP)stgm.hGlobal, i, path, _countof(path)))
{
AppendToPathList(paths, path, i);
}
}
ReleaseStgMedium(&stgm);
}
}
#endif
if (SUCCEEDED(hr))
{
DWORD err = SetClipboardFromString(paths);
hr = HRESULT_FROM_WIN32(err);
}
if (SUCCEEDED(hr))
*pdwEffect &= DROPEFFECT_COPY;
else
*pdwEffect &= DROPEFFECT_NONE;
return hr;
}

View file

@ -109,3 +109,35 @@ public:
UINT GetFileOp() const override { return FO_MOVE; }
LPCSTR GetVerb() const override { return "moveto"; }
};
class CCopyAsPathMenu
: public CComCoClass<CCopyAsPathMenu, &CLSID_CopyAsPathMenu>
, public CComObjectRootEx<CComMultiThreadModelNoCS>
, public IDropTarget
{
public:
DECLARE_REGISTRY_RESOURCEID(IDR_COPYASPATHMENU)
DECLARE_NOT_AGGREGATABLE(CCopyAsPathMenu)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CCopyAsPathMenu)
COM_INTERFACE_ENTRY_IID(IID_IDropTarget, IDropTarget)
END_COM_MAP()
// IDropTarget
STDMETHODIMP DragEnter(IDataObject *pdto, DWORD grfKeyState, POINTL ptl, DWORD *pdwEffect)
{
*pdwEffect &= DROPEFFECT_COPY;
return S_OK;
}
STDMETHODIMP DragOver(DWORD grfKeyState, POINTL ptl, DWORD *pdwEffect)
{
*pdwEffect &= DROPEFFECT_COPY;
return S_OK;
}
STDMETHODIMP DragLeave()
{
return S_OK;
}
STDMETHODIMP Drop(IDataObject *pdto, DWORD grfKeyState, POINTL ptl, DWORD *pdwEffect);
};

View file

@ -797,6 +797,7 @@ BEGIN
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -797,6 +797,7 @@ BEGIN
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -805,6 +805,7 @@ BEGIN
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -804,6 +804,7 @@ BEGIN
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -798,6 +798,7 @@ BEGIN
IDS_DISCONNECT "Trennen"
IDS_OPENFILELOCATION "Date&ipfad öffnen"
IDS_SENDTO_MENU "S&enden an"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Fehler beim Verschieben der Datei/des Ordners"
IDS_COPYERRORTITLE "Fehler beim Kopieren der Datei/des Ordners"

View file

@ -797,6 +797,7 @@ BEGIN
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -797,6 +797,7 @@ BEGIN
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -797,6 +797,7 @@ BEGIN
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -806,6 +806,7 @@ BEGIN
IDS_DISCONNECT "Desconectar"
IDS_OPENFILELOCATION "Abrir &ubicación del archivo"
IDS_SENDTO_MENU "E&nviar a"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error moviendo Archivo o Carpeta"
IDS_COPYERRORTITLE "Error copiando Archivo o Carpeta"

View file

@ -804,6 +804,7 @@ BEGIN
IDS_DISCONNECT "Katkesta ühendus"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -804,6 +804,7 @@ BEGIN
IDS_DISCONNECT "Deskonektatu"
IDS_OPENFILELOCATION "Ireki &fitxategi kokalekua"
IDS_SENDTO_MENU "&Bidali hona"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Errore bat gertatu da fitxategia edo karpeta lekuz aldatzean"
IDS_COPYERRORTITLE "Errore bat gertatu da fitxategia edo karpeta kopiatzean"

View file

@ -797,6 +797,7 @@ BEGIN
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -797,6 +797,7 @@ BEGIN
IDS_DISCONNECT "Déconnecter"
IDS_OPENFILELOCATION "Ouvrir l'empla&cement du fichier"
IDS_SENDTO_MENU "Envo&yer vers"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Erreur lors du déplacement du fichier ou du dossier"
IDS_COPYERRORTITLE "Erreur lors de la copie du fichier ou du dossier"

View file

@ -804,6 +804,7 @@ BEGIN
IDS_DISCONNECT "נתק"
IDS_OPENFILELOCATION "&פתח מיקום קובץ"
IDS_SENDTO_MENU "&שלח אל"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -804,6 +804,7 @@ BEGIN
IDS_DISCONNECT "डिस्कनेक्ट"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -796,6 +796,7 @@ BEGIN
IDS_DISCONNECT "Leválasztás"
IDS_OPENFILELOCATION "Tartalmazó &mappa megnyitása"
IDS_SENDTO_MENU "&Küldés"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Nem sikerült áthelyezni a fájlt/mappát"
IDS_COPYERRORTITLE "Nem sikerült másolni a fájlt/mappát"

View file

@ -794,6 +794,7 @@ BEGIN
IDS_DISCONNECT "Putuskan"
IDS_OPENFILELOCATION "&Buka lokasi berkas"
IDS_SENDTO_MENU "Kiri&m Ke"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Kesalahan memindahkan Berkas atau Folder"
IDS_COPYERRORTITLE "Kesalahan menyalin Berkas atau Folder"

View file

@ -797,6 +797,7 @@ BEGIN
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -794,6 +794,7 @@ BEGIN
IDS_DISCONNECT "接続の切断"
IDS_OPENFILELOCATION "ファイルの場所を開く(&I)"
IDS_SENDTO_MENU "送る(&N)"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "ファイルまたはフォルダの移動のエラー"
IDS_COPYERRORTITLE "ファイルまたはフォルダのコピーのエラー"

View file

@ -804,6 +804,7 @@ BEGIN
IDS_DISCONNECT "연결 끊기"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -797,6 +797,7 @@ BEGIN
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -797,6 +797,7 @@ BEGIN
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -806,6 +806,7 @@ BEGIN
IDS_DISCONNECT "Odłącz"
IDS_OPENFILELOCATION "O&twórz lokalizację pliku"
IDS_SENDTO_MENU "Wyślij d&o"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Błąd przenoszenia pliku lub folderu"
IDS_COPYERRORTITLE "Błąd kopiowania pliku lub folderu"

View file

@ -797,6 +797,7 @@ BEGIN
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -797,6 +797,7 @@ BEGIN
IDS_DISCONNECT "Desligar"
IDS_OPENFILELOCATION "Abrir localização do f&icheiro"
IDS_SENDTO_MENU "&Enviar para"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Erro ao mover pasta ou ficheiro"
IDS_COPYERRORTITLE "Erro ao copiar pasta ou ficheiro"

View file

@ -805,6 +805,7 @@ BEGIN
IDS_DISCONNECT "Deconectea&ză"
IDS_OPENFILELOCATION "&Deschide locația fișierului"
IDS_SENDTO_MENU "T&rimitere la"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Nu s-a putut muta fișierul sau folderul"
IDS_COPYERRORTITLE "Nu s-a putut copia fișierul sau folderul"

View file

@ -806,6 +806,7 @@ BEGIN
IDS_DISCONNECT "Отсоединить"
IDS_OPENFILELOCATION "Открыть &расположение объекта"
IDS_SENDTO_MENU "Отправит&ь"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Ошибка при перемещении папки или файла"
IDS_COPYERRORTITLE "Ошибка при копировании папки или файла"

View file

@ -797,6 +797,7 @@ BEGIN
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -797,6 +797,7 @@ BEGIN
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -804,6 +804,7 @@ BEGIN
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -797,6 +797,7 @@ BEGIN
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -806,6 +806,7 @@ BEGIN
IDS_DISCONNECT "Bağlantıyı kes"
IDS_OPENFILELOCATION "&Dosya konumunu aç"
IDS_SENDTO_MENU "&Gönder"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Dosya veya Dizin Taşıma Hatası"
IDS_COPYERRORTITLE "Dosya veya Dizin Kopyalama Hatası"

View file

@ -797,6 +797,7 @@ BEGIN
IDS_DISCONNECT "Відключити"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_SENDTO_MENU "Se&nd To"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "Error Moving File or Folder"
IDS_COPYERRORTITLE "Error Copying File or Folder"

View file

@ -805,6 +805,7 @@ BEGIN
IDS_DISCONNECT "断开"
IDS_OPENFILELOCATION "打开文件位置(&I)"
IDS_SENDTO_MENU "发送到(&N)"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "无法移动文件或文件夹"
IDS_COPYERRORTITLE "无法复制文件或文件夹"

View file

@ -803,6 +803,7 @@ BEGIN
IDS_DISCONNECT "中斷"
IDS_OPENFILELOCATION "開啟檔案位置(&I)"
IDS_SENDTO_MENU "傳送到(&N)"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "移動檔案或資料夾發生錯誤"
IDS_COPYERRORTITLE "複製檔案或資料夾發生錯誤"

View file

@ -804,6 +804,7 @@ BEGIN
IDS_DISCONNECT "中斷"
IDS_OPENFILELOCATION "開啟檔案位置(&I)"
IDS_SENDTO_MENU "傳送到(&N)"
IDS_COPYASPATHMENU "Copy as path"
IDS_MOVEERRORTITLE "移動檔案或資料夾發生錯誤"
IDS_COPYERRORTITLE "複製檔案或資料夾發生錯誤"

View file

@ -0,0 +1,28 @@
HKCR
{
NoRemove CLSID
{
ForceRemove {F3D06E7C-1E45-4A26-847E-F9FCDEE59BE0} = s 'Copy as Path Menu'
{
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
}
}
NoRemove AllFilesystemObjects
{
NoRemove shell
{
ForceRemove copyaspath
{
val MUIVerb = s '@%MODULE%,-30328'
val Extended = s ''
DropTarget
{
val CLSID = s '{F3D06E7C-1E45-4A26-847E-F9FCDEE59BE0}'
}
}
}
}
}

View file

@ -30,5 +30,6 @@ 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"
IDR_COPYASPATHMENU REGISTRY "res/rgs/copyaspathmenu.rgs"
IDR_COPYTOMENU REGISTRY "res/rgs/copytomenu.rgs"
IDR_MOVETOMENU REGISTRY "res/rgs/movetomenu.rgs"

View file

@ -291,6 +291,7 @@ BEGIN_OBJECT_MAP(ObjectMap)
OBJECT_ENTRY(CLSID_OpenWithMenu, COpenWithMenu)
OBJECT_ENTRY(CLSID_NewMenu, CNewMenu)
OBJECT_ENTRY(CLSID_SendToMenu, CSendToMenu)
OBJECT_ENTRY(CLSID_CopyAsPathMenu, CCopyAsPathMenu)
OBJECT_ENTRY(CLSID_CopyToMenu, CCopyToMenu)
OBJECT_ENTRY(CLSID_MoveToMenu, CMoveToMenu)
OBJECT_ENTRY(CLSID_StartMenu, CStartMenuDummy)

View file

@ -245,6 +245,7 @@
#define IDS_OPENFILELOCATION 341
#define IDS_SENDTO_MENU 343
#define IDS_COPYASPATHMENU 30328
#define IDS_MOVEERRORTITLE 344
#define IDS_COPYERRORTITLE 345
@ -909,3 +910,4 @@
#define IDR_SENDTOMENU 158
#define IDR_COPYTOMENU 159
#define IDR_MOVETOMENU 160
#define IDR_COPYASPATHMENU 161

View file

@ -140,6 +140,7 @@ DEFINE_GUID(CLSID_SysTray, 0x35CEC8A3, 0x2BE6, 0x11D2, 0x87, 0x7
DEFINE_GUID(CLSID_BackgroundTaskScheduler, 0x603D3800, 0xBD81, 0x11d0, 0xA3, 0xA5, 0x00, 0xC0, 0x4F, 0xD7, 0x06, 0xEC);
DEFINE_GUID(CLSID_SharedTaskScheduler, 0x603D3801, 0xBD81, 0x11d0, 0xA3, 0xA5, 0x00, 0xC0, 0x4F, 0xD7, 0x06, 0xEC);
DEFINE_GUID(CLSID_SendToMenu, 0x7BA4C740, 0x9E81, 0x11CF, 0x99, 0xD3, 0x00, 0xAA, 0x00, 0x4A, 0xE8, 0x37);
DEFINE_GUID(CLSID_CopyAsPathMenu, 0xF3D06E7C, 0x1E45, 0x4A26, 0x84, 0x7E, 0xF9, 0xFC, 0xDE, 0xE5, 0x9B, 0xE0);
DEFINE_GUID(CLSID_CopyToMenu, 0xC2FBB630, 0x2971, 0x11D1, 0xA1, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0x5D, 0x13);
DEFINE_GUID(CLSID_MoveToMenu, 0xC2FBB631, 0x2971, 0x11D1, 0xA1, 0x8C, 0x00, 0xC0, 0x4F, 0xD7, 0x5D, 0x13);
DEFINE_GUID(CLSID_MruPidlList, 0x42AEDC87, 0x2188, 0x41FD, 0xB9, 0xA3, 0x0C, 0x96, 0x6F, 0xEA, 0xBE, 0xC1);