[SHELL32] Implement 'Open file location' of shortcut files (#2028)

"Open file location" is a feature to open the location of the target of a shortcut file.
Ideally we should probably use SHOpenFolderAndSelectItems here, but that is not 100% implemented in ros yet... CORE-12770
This commit is contained in:
Katayama Hirofumi MZ 2019-11-12 16:47:36 +09:00 committed by GitHub
parent 23e575c1bc
commit c0f340bca5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
37 changed files with 101 additions and 15 deletions

View file

@ -278,9 +278,9 @@ CShellLink::CShellLink()
m_pDBList = NULL;
m_bInInit = FALSE;
m_hIcon = NULL;
m_idCmdFirst = 0;
m_sLinkPath = NULL;
m_iIdOpen = -1;
/**/sProduct = sComponent = NULL;/**/
}
@ -2578,7 +2578,9 @@ HRESULT STDMETHODCALLTYPE CShellLink::Initialize(PCIDLIST_ABSOLUTE pidlFolder, I
HRESULT STDMETHODCALLTYPE CShellLink::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
{
int id = 1;
INT id = 0;
m_idCmdFirst = idCmdFirst;
TRACE("%p %p %u %u %u %u\n", this,
hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
@ -2586,31 +2588,54 @@ HRESULT STDMETHODCALLTYPE CShellLink::QueryContextMenu(HMENU hMenu, UINT indexMe
if (!hMenu)
return E_INVALIDARG;
WCHAR wszOpen[20];
if (!LoadStringW(shell32_hInstance, IDS_OPEN_VERB, wszOpen, _countof(wszOpen)))
*wszOpen = L'\0';
CStringW strOpen(MAKEINTRESOURCEW(IDS_OPEN_VERB));
CStringW strOpenFileLoc(MAKEINTRESOURCEW(IDS_OPENFILELOCATION));
MENUITEMINFOW mii;
ZeroMemory(&mii, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
mii.dwTypeData = wszOpen;
mii.dwTypeData = strOpen.GetBuffer();
mii.cch = wcslen(mii.dwTypeData);
mii.wID = idCmdFirst + id++;
mii.fState = MFS_DEFAULT | MFS_ENABLED;
mii.fType = MFT_STRING;
if (!InsertMenuItemW(hMenu, indexMenu, TRUE, &mii))
if (!InsertMenuItemW(hMenu, indexMenu++, TRUE, &mii))
return E_FAIL;
m_iIdOpen = 1;
mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
mii.dwTypeData = strOpenFileLoc.GetBuffer();
mii.cch = wcslen(mii.dwTypeData);
mii.wID = idCmdFirst + id++;
mii.fState = MFS_ENABLED;
mii.fType = MFT_STRING;
if (!InsertMenuItemW(hMenu, indexMenu++, TRUE, &mii))
return E_FAIL;
UNREFERENCED_PARAMETER(indexMenu);
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, id);
}
HRESULT CShellLink::DoOpenFileLocation()
{
WCHAR szParams[MAX_PATH + 64];
StringCbPrintfW(szParams, sizeof(szParams), L"/select,%s", m_sPath);
INT_PTR ret;
ret = reinterpret_cast<INT_PTR>(ShellExecuteW(NULL, NULL, L"explorer.exe", szParams,
NULL, m_Header.nShowCommand));
if (ret <= 32)
{
ERR("ret: %08lX\n", ret);
return E_FAIL;
}
return S_OK;
}
HRESULT STDMETHODCALLTYPE CShellLink::InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
{
LPWSTR args = NULL;
LPWSTR path = NULL;
TRACE("%p %p\n", this, lpici);
if (lpici->cbSize < sizeof(CMINVOKECOMMANDINFO))
@ -2627,7 +2652,25 @@ HRESULT STDMETHODCALLTYPE CShellLink::InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
return hr;
}
path = strdupW(m_sPath);
UINT idCmd = LOWORD(lpici->lpVerb);
TRACE("idCmd: %d\n", idCmd);
switch (idCmd)
{
case IDCMD_OPEN:
return DoOpen(lpici);
case IDCMD_OPENFILELOCATION:
return DoOpenFileLocation();
default:
return E_NOTIMPL;
}
}
HRESULT CShellLink::DoOpen(LPCMINVOKECOMMANDINFO lpici)
{
HRESULT hr;
LPWSTR args = NULL;
LPWSTR path = strdupW(m_sPath);
if ( lpici->cbSize == sizeof(CMINVOKECOMMANDINFOEX) &&
(lpici->fMask & CMIC_MASK_UNICODE) )

View file

@ -51,16 +51,20 @@ public:
/* Link file formats */
#include "pshpack1.h"
struct volume_info
{
DWORD type;
DWORD serial;
WCHAR label[12]; /* assume 8.3 */
};
#include "poppack.h"
enum IDCMD
{
IDCMD_OPEN = 0,
IDCMD_OPENFILELOCATION
};
private:
/* Cached link header */
SHELL_LINK_HEADER m_Header;
@ -83,13 +87,13 @@ private:
LPDBLIST m_pDBList; /* Optional data block list (in the extra data section) */
BOOL m_bInInit; // in initialization or not
HICON m_hIcon;
UINT m_idCmdFirst;
/* Pointers to strings inside Logo3/Darwin info blocks, cached for debug info purposes only */
LPWSTR sProduct;
LPWSTR sComponent;
LPWSTR m_sLinkPath;
INT m_iIdOpen; /* ID of the "Open" entry in the context menu */
CComPtr<IUnknown> m_site;
CComPtr<IDropTarget> m_DropTarget;
@ -102,6 +106,9 @@ private:
HRESULT SetTargetFromPIDLOrPath(LPCITEMIDLIST pidl, LPCWSTR pszFile);
HICON CreateShortcutIcon(LPCWSTR wszIconPath, INT IconIndex);
HRESULT DoOpen(LPCMINVOKECOMMANDINFO lpici);
HRESULT DoOpenFileLocation();
public:
CShellLink();
~CShellLink();

View file

@ -770,6 +770,7 @@ BEGIN
IDS_PASTE "Вмъкване"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Paste"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -775,6 +775,7 @@ BEGIN
IDS_PASTE "Vložit"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Složku '%1' nebylo možné vytvořit"
IDS_CREATEFOLDER_CAPTION "Složku nebylo možné vytvořit"

View file

@ -775,6 +775,7 @@ BEGIN
IDS_PASTE "Paste"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -770,6 +770,7 @@ BEGIN
IDS_PASTE "Einfügen"
IDS_EJECT "Auswerfen"
IDS_DISCONNECT "Trennen"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED " Der Ordner kann nicht erstellt werden '%1'"
IDS_CREATEFOLDER_CAPTION " Der Ordner kann nicht erstellt werden."

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Paste"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Paste"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Paste"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -777,6 +777,7 @@ BEGIN
IDS_PASTE "Insertar"
IDS_EJECT "Extraer"
IDS_DISCONNECT "Desconectar"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "No se pudo crear la carpeta '%1'"
IDS_CREATEFOLDER_CAPTION "No se pudo crear la carpeta"

View file

@ -776,6 +776,7 @@ BEGIN
IDS_PASTE "Kleebi"
IDS_EJECT "Väljuta"
IDS_DISCONNECT "Katkesta ühendus"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Ei saa luua kausta '%1'"
IDS_CREATEFOLDER_CAPTION "Ei saa kausta luua"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Paste"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Insérer"
IDS_EJECT "Éjecter"
IDS_DISCONNECT "Déconnecter"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Impossible de créer le dossier '%1'"
IDS_CREATEFOLDER_CAPTION "Impossible de créer un dossier"

View file

@ -771,6 +771,7 @@ BEGIN
IDS_PASTE "הכנס"
IDS_EJECT "הוצא"
IDS_DISCONNECT "נתק"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "पैस्ट"
IDS_EJECT "इजेक्ट"
IDS_DISCONNECT "डिस्कनेक्ट"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "फ़ोल्डर '%1' बनाने में असमर्थ"
IDS_CREATEFOLDER_CAPTION "फ़ोल्डर बनाने में असमर्थ"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Paste"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Tempel"
IDS_EJECT "Keluarkan"
IDS_DISCONNECT "Putuskan"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Tidak bisa membuat folder folder '%1'"
IDS_CREATEFOLDER_CAPTION "Tidak bisa membuat folder"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Inserisci"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -766,6 +766,7 @@ BEGIN
IDS_PASTE "挿入"
IDS_EJECT "取り出し"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "フォルダ '%1' を作成できません"
IDS_CREATEFOLDER_CAPTION "フォルダを作成できません"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Paste"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Paste"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Sett inn"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -774,6 +774,7 @@ BEGIN
IDS_PASTE "Włóż"
IDS_EJECT "Wysuń"
IDS_DISCONNECT "Odłącz"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Nie można utworzyć folderu '%1'"
IDS_CREATEFOLDER_CAPTION "Nie można utworzyć folderu"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Inserir"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Inserir"
IDS_EJECT "Eject"
IDS_DISCONNECT "Desligar"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Impossivel de criar pasta '%1'"
IDS_CREATEFOLDER_CAPTION "Impossivel de criar pasta"

View file

@ -771,6 +771,7 @@ BEGIN
IDS_PASTE "&Lipește"
IDS_EJECT "S&coate"
IDS_DISCONNECT "Deconectea&ză"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Nu poate fi creat un dosar cu numele „%1”"
IDS_CREATEFOLDER_CAPTION "Nu poate fi creat dosar"

View file

@ -776,6 +776,7 @@ BEGIN
IDS_PASTE "Вставить"
IDS_EJECT "Извлечь"
IDS_DISCONNECT "Отсоединить"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Невозможно создать папку '%1'"
IDS_CREATEFOLDER_CAPTION "Невозможно создать папку"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Vložiť"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Paste"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -773,6 +773,7 @@ BEGIN
IDS_PASTE "Fut"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Unable to create the folder '%1'"
IDS_CREATEFOLDER_CAPTION "Unable to create folder"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Klistra in"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Kunde inte skapa mappen '%1'"
IDS_CREATEFOLDER_CAPTION "Kunde inte skapa mapp"

View file

@ -771,6 +771,7 @@ BEGIN
IDS_PASTE "Yapıştır"
IDS_EJECT "Eject"
IDS_DISCONNECT "Disconnect"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED """%1"" dizini oluşturulamıyor."
IDS_CREATEFOLDER_CAPTION "Dizin Oluşturulamıyor"

View file

@ -769,6 +769,7 @@ BEGIN
IDS_PASTE "Вставити"
IDS_EJECT "Витягнути"
IDS_DISCONNECT "Відключити"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "Не вдалося створити папку '%1'"
IDS_CREATEFOLDER_CAPTION "Не вдалося створити папку"

View file

@ -777,6 +777,7 @@ BEGIN
IDS_PASTE "贴上"
IDS_EJECT "弹出"
IDS_DISCONNECT "断开"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "无法创建文件夹 '%1'"
IDS_CREATEFOLDER_CAPTION "无法创建文件夹"

View file

@ -778,6 +778,7 @@ BEGIN
IDS_PASTE "插入"
IDS_EJECT "退出"
IDS_DISCONNECT "中斷"
IDS_OPENFILELOCATION "Open f&ile location"
IDS_CREATEFOLDER_DENIED "無法建立資料夾 '%1'"
IDS_CREATEFOLDER_CAPTION "無法建立資料夾"

View file

@ -227,6 +227,8 @@
#define IDS_EJECT 339
#define IDS_DISCONNECT 340
#define IDS_OPENFILELOCATION 341
#define IDS_MENU_EMPTY 34561
/* Note: those strings are referenced from the registry */