所以我编写了一些代码来使用文件路径字符串作为输入从文件中获取缩略图。首先,我在该位置获取 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 很陌生,但错误消息没有任何帮助,并且我不知道我做错了什么。