Delphi sample but it easy to convert it to any language you use:
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;