无法使用 IThumbnailProvider 从 IShellItem 获取缩略图

问题描述 投票:0回答:1

所以我编写了一些代码来使用文件路径字符串作为输入从文件中获取缩略图。首先,我在该位置获取 IShellItem,然后获取 IThumbnailProvider,现在我尝试从 ThumbnailProvider 获取缩略图。

unsafe {
    CoInitialize(None).expect("Failed to initialize COM");

    let item: IShellItem = SHCreateItemFromParsingName(
        w!("J:\\Apps\\Dolphin-x64\\Dolphin.exe"),
        None
    ).expect("Failed to get shell item");

    let thumb_provider: IThumbnailProvider = item
        .BindToHandler(None, &BHID_ThumbnailHandler)
        .expect("Failed to get thumbnail provider");

    let mut icon_bitmap_ref = MaybeUninit::<HBITMAP>::uninit();

    let mut alpha_type = MaybeUninit::<WTS_ALPHATYPE>::uninit();

    let mut icon_bitmap = MaybeUninit::<BITMAP>::uninit();

    thumb_provider
        .GetThumbnail(96, icon_bitmap_ref.as_mut_ptr(), alpha_type.as_mut_ptr())
        .expect("Failed to get thumbnail");
    // Errors right after this

    match
        GetObjectW(
            icon_bitmap_ref.assume_init(),
            std::mem::size_of::<BITMAP>() as i32,
            Some(icon_bitmap.as_mut_ptr().cast())
        )
    {
        0 => panic!("Failed to get bitmap"),
        _ => {
            let icon_image = match alpha_type.assume_init() {
                WTSAT_UNKNOWN => bitmap_to_image(icon_bitmap.assume_init(), true),
                WTSAT_RGB => bitmap_to_image(icon_bitmap.assume_init(), false),
                WTSAT_ARGB => bitmap_to_image(icon_bitmap.assume_init(), true),
                _ => unreachable!("Unknown alpha type"),
            };

            icon_image.save("icon.png").expect("Failed to save icon");
        }
    }

    CoUninitialize();
}

但是每次我尝试运行它时,它都会返回此错误

Failed to get thumbnail provider: Error { code: HRESULT(0x80004001), message: "Not implemented" }

老实说,如果这只是内存问题,我不会感到惊讶,因为我从未用 C 或 C++ 编程,而且我对 win32 和低级 rust 很陌生,但错误消息没有任何帮助,并且我不知道我做错了什么。

file winapi rust thumbnails windows-shell
1个回答
0
投票

正如 @RemyLebeau 所说,可执行文件没有缩略图提供程序

IShellItemImageFactory接口

公开一个方法来返回 Shell 项目的图标或缩略图。 如果所请求的项目没有可用的缩略图或图标,则会显示 每个类的图标可以从 Shell 提供。

完整示例使用图像工厂

© www.soinside.com 2019 - 2024. All rights reserved.