4

filecontextmenu に関する dll を構築しています。マウスの右クリック時に実行パスとショートカット displaynem を取得する必要があります。これでパスを取得できますが、表示名を取得する方法がわかりません。例: デスクトップの IE ショートカット。「iexplore.exe」ではなく、ユーザーが編集できる「IE」という名前が必要です。

ここに非常によく似たリファレンスがありますが、デスクトップのショートカットが

私が非常に感謝する提案があれば、ここに私のコードと感謝があります。

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

1 に答える 1

0

MSDN で言及されているように、「CF_HDROP や CFSTR_SHELLIDLIST (HIDA とも呼ばれます) などのクリップボード形式ではなく、シェル項目配列をハンドラーで使用することをお勧めします。これにより、コードが単純になり、パフォーマンスが向上します。」

したがって、最初に pDataObj で SHCreateShellItemArrayFromDataObject() を呼び出し、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 ID がある場所:-)

于 2012-11-07T11:37:31.407 に答える