potisanのプログラミングメモ

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

C++20&WIL ごみ箱内の項目を列挙する

C++20とWILでごみ箱内のシェル項目を列挙するサンプルコードです。実行するとごみ箱内の項目の表示名を出力します。

#include <functional>
#include <iostream>

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

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

void ForEachItems(IShellItem* pparent, std::function<void(IShellItem*)> fn)
{
    wil::com_ptr<IEnumShellItems> items;
    THROW_IF_FAILED(pparent->BindToHandler(
        nullptr, BHID_EnumItems, IID_PPV_ARGS(items.put())));

    wil::com_ptr<IShellItem> item;
    HRESULT hr;
    while ((hr = items->Next(1, item.put(), nullptr)) != S_FALSE)
    {
        THROW_IF_FAILED(hr);
        fn(item.get());
    }
}

int main()
{
    std::wcout.imbue(std::locale("", std::locale::ctype));

    auto coinit{ wil::CoInitializeEx(COINIT_APARTMENTTHREADED) };

    wil::com_ptr<IShellItem> recycleBin;
    THROW_IF_FAILED(SHGetKnownFolderItem(
        FOLDERID_RecycleBinFolder, KF_FLAG_DEFAULT, nullptr, IID_PPV_ARGS(recycleBin.put())));

    ForEachItems(recycleBin.get(), [](IShellItem* pitem)
        {
            wil::unique_cotaskmem_string displayName;
            THROW_IF_FAILED(pitem->GetDisplayName(
                SIGDN_DESKTOPABSOLUTEPARSING, displayName.put()));

            // TODO:ここで表示名を処理します。
            std::wcout << displayName.get() << std::endl;
        });

    return 0;
}