Das nuss ausgeführt werden, solange das
Handle gültig ist, also innerhalb von GetThumbFromCache
Das mache ich auch. Es wird mir von der Funktion auch ein Bild zurückgeliefert, nur steht es auf den kopf. Und wenn ich deine FlipBitmap-Funktion verwende, bekomme ich die oben genannte
AV. Mein Code sieht im Moment so aus:
Delphi-Quellcode:
function TForm2.GetThumbFromCache(AFileName: string; out Bmp: TBitmap; AMaxSize: Integer = 120): HRESULT;
var
thumbcache: IThumbnailCache;
sharedbmp: ISharedBitmap;
shellitem: IShellItem;
thumbflags: PWTS_CACHEFLAGS;
thumbid: PWTS_THUMBNAILID;
thumbsize: TSize;
hBmp: HBITMAP;
begin
if not Assigned(Bmp) then
Exit;
Result := CoInitialize(Nil);
Result := CoCreateInstance(
CLSID_LocalThumbnailCache,
nil,
CLSCTX_INPROC,
IThumbnailCache,
thumbcache
);
if Succeeded(Result) then
begin
Result := SHCreateItemFromParsingName(
PChar(AFileName),
nil,
IShellItem,
shellitem
);
if Succeeded(Result) then
begin
Result := thumbcache.GetThumbnail(
shellitem,
AMaxSize,
WTS_EXTRACT,
sharedbmp,
nil, //thumbflags,
nil //thumbid
);
if Succeeded(Result) then
begin
sharedbmp.GetSize(thumbsize);
Result := sharedbmp.GetSharedBitmap(hBmp);
if Succeeded(Result) then
begin
bmp.SetSize(thumbsize.cx, thumbsize.cy);
bmp.Handle := hBmp;
bmp.Dormant;
//FlipBmp(bmp);
MirrorVertical(Bmp);
end;
end;
CoUninitialize;
end;
end;
end;
Mit folgendes Funktion kann ich das Bild drehen, die soll allerdings langsam sein:
Delphi-Quellcode:
Procedure MirrorVertical(var Picture: TBitmap);
var BMP: TBitmap;
i,j: integer;
begin
BMP := TBitmap.Create;
BMP.Assign(Picture);
for i := 0 to BMP.Height-1 do
for j := 0 to BMP.Width-1 do
Picture.canvas.Pixels[j, BMP.Height-i-1] := BMP.canvas.Pixels[j, i];
BMP.free;
end;