shell32 — Как получить отображаемое имя ярлыка, если щелкнуть правой кнопкой мыши (c ++ / c #)

я создаю dll о filecontextmenu, мне нужно получить путь выполнения и ярлык displaynem при щелчке правой кнопкой мыши. Теперь я могу получить путь, но не знаю, как получить отображаемое имя.
Пример: IE ярлык на рабочем столе, мне нужно имя «IE», которое может редактировать пользователь, а не «iexplore.exe».

вот ссылка очень похоже, но я не могу узнать, что я должен делать, когда ярлык на рабочем столе

Если есть какие-либо предложения, я буду очень признателен, вот мой код и спасибо.

IFACEMETHODIMP FileContextMenuExt::Initialize(
LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hKeyProgID)

if (NULL == pDataObj)
return E_INVALIDARG;

HRESULT hr = E_FAIL;

FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stm;

// The pDataObj pointer contains the objects being acted upon. In this
// example, we get an HDROP handle for enumerating the selected files and
// folders.
if (SUCCEEDED(pDataObj->GetData(&fe, &stm)))
{
// Get an HDROP handle.
HDROP hDrop = static_cast<HDROP>(GlobalLock(stm.hGlobal));

if (hDrop != NULL)
{
UINT nFiles = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, 0);
if (nFiles > 0)
{
vecSelectFiles.clear();
std::vector<std::wstring> vecTotalFiles;
vecTotalFiles.clear();
for(int i=0; i<(int)nFiles; ++i)
{
wchar_t wszThisFile[MAX_PATH];
memset(wszThisFile, 0, MAX_PATH*2);
// Here get excution path
if(DragQueryFileW(hDrop, i, wszThisFile, MAX_PATH) != 0)
{
vecTotalFiles.push_back(wszThisFile);
hr = S_OK;
}
}
}
GlobalUnlock(stm.hGlobal);
}
ReleaseStgMedium(&stm);
}

// If any value other than S_OK is returned from the method, the context
// menu item is not displayed.
return hr;

4

Решение

Как упоминалось в MSDN, «рекомендуется, чтобы обработчики использовали массив элементов оболочки, а не форматы буфера обмена, такие как CF_HDROP и CFSTR_SHELLIDLIST (также известный как HIDA), поскольку это приводит к упрощению кода и позволяет повысить производительность».

Итак, сначала вызовите SHCreateShellItemArrayFromDataObject () для pDataObj и получите интерфейс IShellItemArray. Перечислите его с помощью IShellItemArray :: Count () и IShellItemArray :: GetItemAt ().

Каждый объект IShellItem имеет отличный метод GetDisplayName ()!
Вы можете указать тип дисплея:

SIGDN_NORMALDISPLAY = 0x00000000,
SIGDN_PARENTRELATIVEPARSING = 0x80018001,
SIGDN_PARENTRELATIVEFORADDRESSBAR = 0x8001c001,
SIGDN_DESKTOPABSOLUTEPARSING = 0x80028000,
SIGDN_PARENTRELATIVEEDITING = 0x80031001,
SIGDN_DESKTOPABSOLUTEEDITING = 0x8004c000,
SIGDN_FILESYSPATH = 0x80058000,
SIGDN_URL = 0x80068000,

Где у вас есть идентификаторы SIGDN_FILESYSPATH и SIGDN_NORMALDISPLAY 🙂

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]