potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C++20&Win API SHGetNameFromIDList関数で項目の表示名を取得する

シェル項目の表示名を取得するにはSHGetNameFromIDList関数を使えます。C++環境ではIShellItemインターフェイスを使いますが、Pythonなどでインターフェイスを介したくない場合に便利です。

#include <format>
#include <iostream>

#define STRICT
#define NOMINMAX
#include <Windows.h>
#include <ShlObj.h>

// WIL 1.0.220201.1 (Microsoft)
#include "wil/com.h"

int main()
{
    auto coinit = wil::CoInitializeEx();
    if (!coinit) THROW_HR(E_FAIL);

    wil::unique_cotaskmem_ptr<ITEMIDLIST> pidl;
    THROW_IF_FAILED(SHGetKnownFolderIDList(
        FOLDERID_Fonts, KF_FLAG_DEFAULT, nullptr, wil::out_param(pidl)));

    wil::unique_cotaskmem_string name;
    THROW_IF_FAILED(SHGetNameFromIDList(
        pidl.get(), SIGDN_NORMALDISPLAY, name.put()));

    std::wcout.imbue(std::locale("", std::locale::ctype));
    std::wcout
        << std::format(L"フォントフォルダの表示名:{}", wil::string_get_not_null(name))
        << std::endl;

    return S_OK;
}