potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。

C++&WinAPI CLSID_QuickLinksに対するIDeskBand::GetBandInfoが必ず失敗する

以下のコードの(☆)が不正なメモリアクセス(アドレス0の操作)で確実に失敗します。原因は不明です。

先に実行しているIDeskBand::GetWindowE_FAILを返すので、こちらで判別は可能かもしれません。

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

int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int)
{
    HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
    if (FAILED(hr)) return hr;

    IDeskBand* pDeskBand;
    hr = CoCreateInstance(CLSID_QuickLinks, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDeskBand));
    if (SUCCEEDED(hr))
    {
        HWND hwndDeskBand;
        hr = pDeskBand->GetWindow(&hwndDeskBand);
        // hr: E_FAIL

        DESKBANDINFO bandInfo{};
        hr = pDeskBand->GetBandInfo(0, DBIF_VIEWMODE_NORMAL, &bandInfo); // (☆)
        // <メモリアクセス例外>:nullptr (0)へのアクセス

        pDeskBand->Release();
    }

    CoUninitialize();

    return hr;
}