From 9238a1762f6ac82011737580290a4957d3805a9f Mon Sep 17 00:00:00 2001 From: Whindmar Saksit Date: Sat, 6 Apr 2024 23:01:32 +0200 Subject: [PATCH] [SHELL32] Copy as path shell extension (#6701) * Added Copy as path menu extension --------- Co-authored-by: Thamatip Chitpong --- dll/win32/shell32/CCopyMoveToMenu.cpp | 142 +++++++++++++++++++ dll/win32/shell32/CCopyMoveToMenu.h | 32 +++++ dll/win32/shell32/lang/bg-BG.rc | 1 + dll/win32/shell32/lang/ca-ES.rc | 1 + dll/win32/shell32/lang/cs-CZ.rc | 1 + dll/win32/shell32/lang/da-DK.rc | 1 + dll/win32/shell32/lang/de-DE.rc | 1 + dll/win32/shell32/lang/el-GR.rc | 1 + dll/win32/shell32/lang/en-GB.rc | 1 + dll/win32/shell32/lang/en-US.rc | 1 + dll/win32/shell32/lang/es-ES.rc | 1 + dll/win32/shell32/lang/et-EE.rc | 1 + dll/win32/shell32/lang/eu-ES.rc | 1 + dll/win32/shell32/lang/fi-FI.rc | 1 + dll/win32/shell32/lang/fr-FR.rc | 1 + dll/win32/shell32/lang/he-IL.rc | 1 + dll/win32/shell32/lang/hi-IN.rc | 1 + dll/win32/shell32/lang/hu-HU.rc | 1 + dll/win32/shell32/lang/id-ID.rc | 1 + dll/win32/shell32/lang/it-IT.rc | 1 + dll/win32/shell32/lang/ja-JP.rc | 1 + dll/win32/shell32/lang/ko-KR.rc | 1 + dll/win32/shell32/lang/nl-NL.rc | 1 + dll/win32/shell32/lang/no-NO.rc | 1 + dll/win32/shell32/lang/pl-PL.rc | 1 + dll/win32/shell32/lang/pt-BR.rc | 1 + dll/win32/shell32/lang/pt-PT.rc | 1 + dll/win32/shell32/lang/ro-RO.rc | 1 + dll/win32/shell32/lang/ru-RU.rc | 1 + dll/win32/shell32/lang/sk-SK.rc | 1 + dll/win32/shell32/lang/sl-SI.rc | 1 + dll/win32/shell32/lang/sq-AL.rc | 1 + dll/win32/shell32/lang/sv-SE.rc | 1 + dll/win32/shell32/lang/tr-TR.rc | 1 + dll/win32/shell32/lang/uk-UA.rc | 1 + dll/win32/shell32/lang/zh-CN.rc | 1 + dll/win32/shell32/lang/zh-HK.rc | 1 + dll/win32/shell32/lang/zh-TW.rc | 1 + dll/win32/shell32/res/rgs/copyaspathmenu.rgs | 28 ++++ dll/win32/shell32/rgs_res.rc | 1 + dll/win32/shell32/shell32.cpp | 1 + dll/win32/shell32/shresdef.h | 2 + sdk/include/reactos/shlguid_undoc.h | 1 + 43 files changed, 243 insertions(+) create mode 100644 dll/win32/shell32/res/rgs/copyaspathmenu.rgs diff --git a/dll/win32/shell32/CCopyMoveToMenu.cpp b/dll/win32/shell32/CCopyMoveToMenu.cpp index 859b05eb5b7..f07328cee7d 100644 --- a/dll/win32/shell32/CCopyMoveToMenu.cpp +++ b/dll/win32/shell32/CCopyMoveToMenu.cpp @@ -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 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 item; + hr = array->GetItemAt(i, &item); + if (SUCCEEDED(hr)) + { + CComHeapPtr 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 full; + hr = SHILCombine(folder, item, &full); + if (SUCCEEDED(hr)) + { + PCUITEMID_CHILD child; + CComPtr 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 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; +} diff --git a/dll/win32/shell32/CCopyMoveToMenu.h b/dll/win32/shell32/CCopyMoveToMenu.h index 3b9de7ad91a..224352fc6cb 100644 --- a/dll/win32/shell32/CCopyMoveToMenu.h +++ b/dll/win32/shell32/CCopyMoveToMenu.h @@ -109,3 +109,35 @@ public: UINT GetFileOp() const override { return FO_MOVE; } LPCSTR GetVerb() const override { return "moveto"; } }; + +class CCopyAsPathMenu + : public CComCoClass + , public CComObjectRootEx + , 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); +}; diff --git a/dll/win32/shell32/lang/bg-BG.rc b/dll/win32/shell32/lang/bg-BG.rc index bbc0ecbccc4..b285cef2150 100644 --- a/dll/win32/shell32/lang/bg-BG.rc +++ b/dll/win32/shell32/lang/bg-BG.rc @@ -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" diff --git a/dll/win32/shell32/lang/ca-ES.rc b/dll/win32/shell32/lang/ca-ES.rc index 624b488ca69..58bc255ef18 100644 --- a/dll/win32/shell32/lang/ca-ES.rc +++ b/dll/win32/shell32/lang/ca-ES.rc @@ -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" diff --git a/dll/win32/shell32/lang/cs-CZ.rc b/dll/win32/shell32/lang/cs-CZ.rc index 85ae072de9b..4f319ae1fb2 100644 --- a/dll/win32/shell32/lang/cs-CZ.rc +++ b/dll/win32/shell32/lang/cs-CZ.rc @@ -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" diff --git a/dll/win32/shell32/lang/da-DK.rc b/dll/win32/shell32/lang/da-DK.rc index 13c8039bf07..e167e877674 100644 --- a/dll/win32/shell32/lang/da-DK.rc +++ b/dll/win32/shell32/lang/da-DK.rc @@ -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" diff --git a/dll/win32/shell32/lang/de-DE.rc b/dll/win32/shell32/lang/de-DE.rc index 0e30928c979..3a9cc2cb413 100644 --- a/dll/win32/shell32/lang/de-DE.rc +++ b/dll/win32/shell32/lang/de-DE.rc @@ -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" diff --git a/dll/win32/shell32/lang/el-GR.rc b/dll/win32/shell32/lang/el-GR.rc index c87ee61cf2c..0c90f984112 100644 --- a/dll/win32/shell32/lang/el-GR.rc +++ b/dll/win32/shell32/lang/el-GR.rc @@ -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" diff --git a/dll/win32/shell32/lang/en-GB.rc b/dll/win32/shell32/lang/en-GB.rc index d5e2c46233c..ec257764567 100644 --- a/dll/win32/shell32/lang/en-GB.rc +++ b/dll/win32/shell32/lang/en-GB.rc @@ -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" diff --git a/dll/win32/shell32/lang/en-US.rc b/dll/win32/shell32/lang/en-US.rc index 5b08ed5059c..4c086fe99c4 100644 --- a/dll/win32/shell32/lang/en-US.rc +++ b/dll/win32/shell32/lang/en-US.rc @@ -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" diff --git a/dll/win32/shell32/lang/es-ES.rc b/dll/win32/shell32/lang/es-ES.rc index a04c00e5fdf..b3d0a83f148 100644 --- a/dll/win32/shell32/lang/es-ES.rc +++ b/dll/win32/shell32/lang/es-ES.rc @@ -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" diff --git a/dll/win32/shell32/lang/et-EE.rc b/dll/win32/shell32/lang/et-EE.rc index 39e47129d60..a3ed6377dd3 100644 --- a/dll/win32/shell32/lang/et-EE.rc +++ b/dll/win32/shell32/lang/et-EE.rc @@ -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" diff --git a/dll/win32/shell32/lang/eu-ES.rc b/dll/win32/shell32/lang/eu-ES.rc index 4d0e30ef067..f6281db928f 100644 --- a/dll/win32/shell32/lang/eu-ES.rc +++ b/dll/win32/shell32/lang/eu-ES.rc @@ -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" diff --git a/dll/win32/shell32/lang/fi-FI.rc b/dll/win32/shell32/lang/fi-FI.rc index 8121e505677..d52536711e9 100644 --- a/dll/win32/shell32/lang/fi-FI.rc +++ b/dll/win32/shell32/lang/fi-FI.rc @@ -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" diff --git a/dll/win32/shell32/lang/fr-FR.rc b/dll/win32/shell32/lang/fr-FR.rc index 42ef0d327f7..c74823a130f 100644 --- a/dll/win32/shell32/lang/fr-FR.rc +++ b/dll/win32/shell32/lang/fr-FR.rc @@ -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" diff --git a/dll/win32/shell32/lang/he-IL.rc b/dll/win32/shell32/lang/he-IL.rc index ee1e863c491..151418b5243 100644 --- a/dll/win32/shell32/lang/he-IL.rc +++ b/dll/win32/shell32/lang/he-IL.rc @@ -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" diff --git a/dll/win32/shell32/lang/hi-IN.rc b/dll/win32/shell32/lang/hi-IN.rc index 5af5d067e36..f2914e17d4a 100644 --- a/dll/win32/shell32/lang/hi-IN.rc +++ b/dll/win32/shell32/lang/hi-IN.rc @@ -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" diff --git a/dll/win32/shell32/lang/hu-HU.rc b/dll/win32/shell32/lang/hu-HU.rc index 6069317af52..e384c733aad 100644 --- a/dll/win32/shell32/lang/hu-HU.rc +++ b/dll/win32/shell32/lang/hu-HU.rc @@ -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" diff --git a/dll/win32/shell32/lang/id-ID.rc b/dll/win32/shell32/lang/id-ID.rc index 5aae4ae80e6..bc2abc5ef51 100644 --- a/dll/win32/shell32/lang/id-ID.rc +++ b/dll/win32/shell32/lang/id-ID.rc @@ -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" diff --git a/dll/win32/shell32/lang/it-IT.rc b/dll/win32/shell32/lang/it-IT.rc index 807a8d87e42..7ae6440bddb 100644 --- a/dll/win32/shell32/lang/it-IT.rc +++ b/dll/win32/shell32/lang/it-IT.rc @@ -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" diff --git a/dll/win32/shell32/lang/ja-JP.rc b/dll/win32/shell32/lang/ja-JP.rc index 943bba3734b..f40ef618835 100644 --- a/dll/win32/shell32/lang/ja-JP.rc +++ b/dll/win32/shell32/lang/ja-JP.rc @@ -794,6 +794,7 @@ BEGIN IDS_DISCONNECT "接続の切断" IDS_OPENFILELOCATION "ファイルの場所を開く(&I)" IDS_SENDTO_MENU "送る(&N)" + IDS_COPYASPATHMENU "Copy as path" IDS_MOVEERRORTITLE "ファイルまたはフォルダの移動のエラー" IDS_COPYERRORTITLE "ファイルまたはフォルダのコピーのエラー" diff --git a/dll/win32/shell32/lang/ko-KR.rc b/dll/win32/shell32/lang/ko-KR.rc index 32a75cb14fc..9d2d82a6abd 100644 --- a/dll/win32/shell32/lang/ko-KR.rc +++ b/dll/win32/shell32/lang/ko-KR.rc @@ -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" diff --git a/dll/win32/shell32/lang/nl-NL.rc b/dll/win32/shell32/lang/nl-NL.rc index be18ee6d805..acc5c35aa33 100644 --- a/dll/win32/shell32/lang/nl-NL.rc +++ b/dll/win32/shell32/lang/nl-NL.rc @@ -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" diff --git a/dll/win32/shell32/lang/no-NO.rc b/dll/win32/shell32/lang/no-NO.rc index c36f2506b82..70c1bbfeaa0 100644 --- a/dll/win32/shell32/lang/no-NO.rc +++ b/dll/win32/shell32/lang/no-NO.rc @@ -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" diff --git a/dll/win32/shell32/lang/pl-PL.rc b/dll/win32/shell32/lang/pl-PL.rc index aebdddea73b..63464b74db1 100644 --- a/dll/win32/shell32/lang/pl-PL.rc +++ b/dll/win32/shell32/lang/pl-PL.rc @@ -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" diff --git a/dll/win32/shell32/lang/pt-BR.rc b/dll/win32/shell32/lang/pt-BR.rc index b049f8f6822..ffaeb776230 100644 --- a/dll/win32/shell32/lang/pt-BR.rc +++ b/dll/win32/shell32/lang/pt-BR.rc @@ -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" diff --git a/dll/win32/shell32/lang/pt-PT.rc b/dll/win32/shell32/lang/pt-PT.rc index 2b9e25da9b9..fbadafcd26a 100644 --- a/dll/win32/shell32/lang/pt-PT.rc +++ b/dll/win32/shell32/lang/pt-PT.rc @@ -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" diff --git a/dll/win32/shell32/lang/ro-RO.rc b/dll/win32/shell32/lang/ro-RO.rc index d946d616960..aeae40bc174 100644 --- a/dll/win32/shell32/lang/ro-RO.rc +++ b/dll/win32/shell32/lang/ro-RO.rc @@ -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" diff --git a/dll/win32/shell32/lang/ru-RU.rc b/dll/win32/shell32/lang/ru-RU.rc index fff62aac90c..d9837543a6c 100644 --- a/dll/win32/shell32/lang/ru-RU.rc +++ b/dll/win32/shell32/lang/ru-RU.rc @@ -806,6 +806,7 @@ BEGIN IDS_DISCONNECT "Отсоединить" IDS_OPENFILELOCATION "Открыть &расположение объекта" IDS_SENDTO_MENU "Отправит&ь" + IDS_COPYASPATHMENU "Copy as path" IDS_MOVEERRORTITLE "Ошибка при перемещении папки или файла" IDS_COPYERRORTITLE "Ошибка при копировании папки или файла" diff --git a/dll/win32/shell32/lang/sk-SK.rc b/dll/win32/shell32/lang/sk-SK.rc index bb1c5906e55..55da2ab6809 100644 --- a/dll/win32/shell32/lang/sk-SK.rc +++ b/dll/win32/shell32/lang/sk-SK.rc @@ -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" diff --git a/dll/win32/shell32/lang/sl-SI.rc b/dll/win32/shell32/lang/sl-SI.rc index 95a0102e8a5..ee98c9d77e8 100644 --- a/dll/win32/shell32/lang/sl-SI.rc +++ b/dll/win32/shell32/lang/sl-SI.rc @@ -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" diff --git a/dll/win32/shell32/lang/sq-AL.rc b/dll/win32/shell32/lang/sq-AL.rc index 6a3b857bb1a..bee4ae3512d 100644 --- a/dll/win32/shell32/lang/sq-AL.rc +++ b/dll/win32/shell32/lang/sq-AL.rc @@ -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" diff --git a/dll/win32/shell32/lang/sv-SE.rc b/dll/win32/shell32/lang/sv-SE.rc index ec1799d5fb7..a5d2aa75103 100644 --- a/dll/win32/shell32/lang/sv-SE.rc +++ b/dll/win32/shell32/lang/sv-SE.rc @@ -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" diff --git a/dll/win32/shell32/lang/tr-TR.rc b/dll/win32/shell32/lang/tr-TR.rc index 858c6ae3943..cf3929bd1f5 100644 --- a/dll/win32/shell32/lang/tr-TR.rc +++ b/dll/win32/shell32/lang/tr-TR.rc @@ -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ı" diff --git a/dll/win32/shell32/lang/uk-UA.rc b/dll/win32/shell32/lang/uk-UA.rc index 3e8808b33e9..6f8b873cb40 100644 --- a/dll/win32/shell32/lang/uk-UA.rc +++ b/dll/win32/shell32/lang/uk-UA.rc @@ -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" diff --git a/dll/win32/shell32/lang/zh-CN.rc b/dll/win32/shell32/lang/zh-CN.rc index c82e0ee7e81..38ff2656851 100644 --- a/dll/win32/shell32/lang/zh-CN.rc +++ b/dll/win32/shell32/lang/zh-CN.rc @@ -805,6 +805,7 @@ BEGIN IDS_DISCONNECT "断开" IDS_OPENFILELOCATION "打开文件位置(&I)" IDS_SENDTO_MENU "发送到(&N)" + IDS_COPYASPATHMENU "Copy as path" IDS_MOVEERRORTITLE "无法移动文件或文件夹" IDS_COPYERRORTITLE "无法复制文件或文件夹" diff --git a/dll/win32/shell32/lang/zh-HK.rc b/dll/win32/shell32/lang/zh-HK.rc index 0531adc197f..c8496b4f432 100644 --- a/dll/win32/shell32/lang/zh-HK.rc +++ b/dll/win32/shell32/lang/zh-HK.rc @@ -803,6 +803,7 @@ BEGIN IDS_DISCONNECT "中斷" IDS_OPENFILELOCATION "開啟檔案位置(&I)" IDS_SENDTO_MENU "傳送到(&N)" + IDS_COPYASPATHMENU "Copy as path" IDS_MOVEERRORTITLE "移動檔案或資料夾發生錯誤" IDS_COPYERRORTITLE "複製檔案或資料夾發生錯誤" diff --git a/dll/win32/shell32/lang/zh-TW.rc b/dll/win32/shell32/lang/zh-TW.rc index 43a511d1d7b..ebde56e6a1f 100644 --- a/dll/win32/shell32/lang/zh-TW.rc +++ b/dll/win32/shell32/lang/zh-TW.rc @@ -804,6 +804,7 @@ BEGIN IDS_DISCONNECT "中斷" IDS_OPENFILELOCATION "開啟檔案位置(&I)" IDS_SENDTO_MENU "傳送到(&N)" + IDS_COPYASPATHMENU "Copy as path" IDS_MOVEERRORTITLE "移動檔案或資料夾發生錯誤" IDS_COPYERRORTITLE "複製檔案或資料夾發生錯誤" diff --git a/dll/win32/shell32/res/rgs/copyaspathmenu.rgs b/dll/win32/shell32/res/rgs/copyaspathmenu.rgs new file mode 100644 index 00000000000..a1961e240c1 --- /dev/null +++ b/dll/win32/shell32/res/rgs/copyaspathmenu.rgs @@ -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}' + } + } + } + } +} diff --git a/dll/win32/shell32/rgs_res.rc b/dll/win32/shell32/rgs_res.rc index 9c5aacd0c48..52ef32b014b 100644 --- a/dll/win32/shell32/rgs_res.rc +++ b/dll/win32/shell32/rgs_res.rc @@ -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" diff --git a/dll/win32/shell32/shell32.cpp b/dll/win32/shell32/shell32.cpp index 2847bd7a5c6..3d55c35794f 100644 --- a/dll/win32/shell32/shell32.cpp +++ b/dll/win32/shell32/shell32.cpp @@ -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) diff --git a/dll/win32/shell32/shresdef.h b/dll/win32/shell32/shresdef.h index bcae426f590..d4ed42192a0 100644 --- a/dll/win32/shell32/shresdef.h +++ b/dll/win32/shell32/shresdef.h @@ -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 diff --git a/sdk/include/reactos/shlguid_undoc.h b/sdk/include/reactos/shlguid_undoc.h index c6d2295cb30..19c7178a3a3 100644 --- a/sdk/include/reactos/shlguid_undoc.h +++ b/sdk/include/reactos/shlguid_undoc.h @@ -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);