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;