diff --git a/base/shell/explorer/startctxmnu.cpp b/base/shell/explorer/startctxmnu.cpp index ccee6ef6a7e..83d176eb590 100644 --- a/base/shell/explorer/startctxmnu.cpp +++ b/base/shell/explorer/startctxmnu.cpp @@ -193,27 +193,37 @@ public: InvokeCommand(LPCMINVOKECOMMANDINFO lpici) { UINT uiCmdId = PtrToUlong(lpici->lpVerb); - if (!IsShellCmdId((UINT_PTR)lpici->lpVerb)) + if (!IsShellCmdId(uiCmdId)) { - CMINVOKECOMMANDINFO cmici = { 0 }; - CHAR szDir[MAX_PATH]; + CMINVOKECOMMANDINFOEX cmici = { sizeof(cmici) }; /* Setup and invoke the shell command */ - cmici.cbSize = sizeof(cmici); cmici.hwnd = m_Owner; - if (IS_INTRESOURCE(lpici->lpVerb)) - cmici.lpVerb = MAKEINTRESOURCEA(uiCmdId - INNERIDOFFSET); - else - cmici.lpVerb = lpici->lpVerb; cmici.nShow = SW_NORMAL; - - /* FIXME: Support Unicode!!! */ - if (SHGetPathFromIDListA(m_FolderPidl, szDir)) + cmici.fMask = CMIC_MASK_UNICODE; + WCHAR szVerbW[MAX_PATH]; + if (IS_INTRESOURCE(lpici->lpVerb)) { - cmici.lpDirectory = szDir; + cmici.lpVerb = MAKEINTRESOURCEA(uiCmdId - INNERIDOFFSET); + cmici.lpVerbW = MAKEINTRESOURCEW(uiCmdId - INNERIDOFFSET); + } + else + { + cmici.lpVerb = lpici->lpVerb; + SHAnsiToUnicode(lpici->lpVerb, szVerbW, _countof(szVerbW)); + cmici.lpVerbW = szVerbW; } - return m_Inner->InvokeCommand(&cmici); + CHAR szDirA[MAX_PATH]; + WCHAR szDirW[MAX_PATH]; + if (SHGetPathFromIDListW(m_FolderPidl, szDirW)) + { + SHUnicodeToAnsi(szDirW, szDirA, _countof(szDirA)); + cmici.lpDirectory = szDirA; + cmici.lpDirectoryW = szDirW; + } + + return m_Inner->InvokeCommand((LPCMINVOKECOMMANDINFO)&cmici); } m_TrayWnd->ExecContextMenuCmd(uiCmdId); return S_OK;