Einzelnen Beitrag anzeigen

Benmik

Registriert seit: 11. Apr 2009
569 Beiträge
 
Delphi 12 Athens
 
#1

Hilfe zu IThumbnailProvider

  Alt 4. Nov 2022, 15:03
Ich würde gern ausprobieren, über IThumbnailProvider Miniaturansichten von JPG zu erstellen. Das gestaltet sich aber schwierig, im Internet findet man für Delphi kaum etwas. Bei Stackoverflow habe ich zwei Hinweise gefunden:
Hier folgenden Code:
Delphi-Quellcode:
function LoadBitmapWithShellExtension(const ADllFileName: UnicodeString; const ACLSID: TCLSID;
  const AFileName: UnicodeString; ASize: Integer; out AAlpha: WTS_ALPHATYPE): HBITMAP;
type
  TDllGetClassObject = function(const CLSID, IID: TGUID; out Obj): HRESULT; stdcall;
var
  DllModule: HMODULE;
  DllGetClassObject: TDllGetClassObject;
  ClassFactory: IClassFactory;
  ThumbnailProvider: IThumbnailProvider;
  InitializeWithFile: IInitializeWithFile;
  PersistFile: IPersistFile;
begin
  DllModule := LoadLibraryW(PWideChar(ADllFileName));
  if DllModule = 0 then RaiseLastOSError;
  try
    @DllGetClassObject := GetProcAddress(DllModule, 'DllGetClassObject');
    if not Assigned(DllGetClassObject) then
      RaiseLastOSError;
    OleCheck(DllGetClassObject(ACLSID, IClassFactory, ClassFactory));
    try
      OleCheck(ClassFactory.CreateInstance(nil, IThumbnailProvider, ThumbnailProvider));
      try
        if Succeeded(ThumbnailProvider.QueryInterface(IInitializeWithFile, InitializeWithFile)) then
          try
            OleCheck(InitializeWithFile.Initialize(PWideChar(AFileName), STGM_READ));
          finally
            InitializeWithFile := nil;
          end
        else
          if Succeeded(ThumbnailProvider.QueryInterface(IPersistFile, PersistFile)) then
            try
              OleCheck(PersistFile.Load(PWideChar(AFileName), STGM_READ));
            finally
              PersistFile := nil;
            end
          else
            raise Exception.Create('Cannot initialize handler');

        OleCheck(ThumbnailProvider.GetThumbnail(ASize, Result, AAlpha));
      finally
        ThumbnailProvider := nil;
      end;
    finally
      ClassFactory := nil;
    end;
  finally
    FreeLibrary(DllModule);
  end;
end;
Es war mühsam, den ans Laufen zu bringen; ich habe IThumbnailProvider in Delphi nirgenwo gefunden und musste die Deklaration aus einer anderen Fundstelle einfügen. Letztlich bin ich dann bei DllGetClassObject(ACLSID, IClassFactory, ClassFactory) hängengeblieben, weil mir nicht klar ist, was für ACLSID eingesetzt werden muss. Ich habe dann auch nicht versucht, das herauszuknobeln, weil ich bei System.Win.ComServ.DllGetClassObject gelesen habe: Do not call DllGetClassObject directly. DllGetClassObject is exported by all ActiveX server DLLs, and it is called internally by the operating system. When a user calls CoGetClassObject (or CoCreateInstance, which internally calls CoGetClassObject) to obtain a class factory for an ActiveX object, the OLE engine loads the ActiveX server DLL into memory and calls its DllGetClassObject function. Die Umsetzung von CoCreateInstance ist mir leider auch nicht klar.

Die zweite Stelle ist von Remy Lebeau. Hier gefällt mir 1) mit IInitializeWithStream . Das umzusetzen habe ich aber auch keine Chance.

Hat vielleicht jemand den richtigen Code in der Schublade?
  Mit Zitat antworten Zitat