首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从缩略图提供商(Windows)获取位图

从缩略图提供商(Windows)获取位图
EN

Stack Overflow用户
提问于 2015-08-13 12:57:34
回答 1查看 272关注 0票数 1

据我所知,windows缩略图提供程序是实现IThumbnailProvider接口的DLL。但是,当查看现有的缩略图提供程序的导出函数时,我会看到:

  • DLLCanUnloadNow
  • DLLGetClassObject
  • DLLRegisterServer
  • DllUnregisterServer

使用这些导出的函数,如何获得GetThumbnail函数是可能的。

EN

回答 1

Stack Overflow用户

发布于 2015-08-13 17:15:52

Delphi示例,但很容易将其转换为您使用的任何语言:

代码语言:javascript
复制
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;
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31988926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档