Free VCL - DWG para Delphi:

ScreenShot:
http://www.cadsofttools.com/images/cadimportvcl.gif

Download:
http://www.cadsofttools.com/download/cadimportvcl.zip

Espero ter ajudado...



Andy escreveu:
>
>
> Segue abaixo o código que estou usando. É um código que achei na web (
> http://www.delphi3000.com 
> <http://www.delphi3000.com><http://www.delphi3000.com/articles/article_3806.asp
>  
> <http://www.delphi3000.com/articles/article_3806.asp>>),
> porém o site de onde peguei está fora do ar.
> Estou mandando a unit completa, pois se alguém mais quiser é só pegar. Ela
> funcionou bem para todos os arquivos que testei, exceto para arquivos .dwg
> E eu tenho AutoCAD instalado no meu computador. Além disso, o thumbnail do
> windows mostra normalmente a miniatura dos arquivos .dwg
>
> A única função que é preciso chamar é a última do arquivo: *
> GetBitmapFromFile(**const FileName: String): TGraphic;*
> E esta função retorna um TGraphic que utilizo para fazer um Assign em um
> TImage, como abaixo:
> Para Usar: *Image1.Picture.Assign(**GetBitmapFromFile(OpenDialog1.**
> FileName))*
>
> Nesta função eu coloquei um* if (not AnsiEndsStr('.dwg', FileName))* para
> filtar os arquivos dwg, pois o problema está exatamente na função
> *ExtractImageGetFileThumbnail.
> *com este if, a função funciona e retorna um Ícone do dwg.
>
> Obrigado,
> Anderson
>
> *Código:*
>
> unit ShellObjHelper;
>
> {$IFDEF VER100}{$DEFINE DELPHI3}{$ENDIF}
>
> interface
>
> uses
> Windows, ShlObj, ActiveX, ShellAPI, Graphics, StrUtils;
>
> type
> { from ShlObjIdl.h }
> IExtractImage = interface
> ['{BB2E617C-0920-11D1-9A0B-00C04FC2D6C1}']
> function GetLocation(Buffer: PWideChar;
> BufferSize: DWORD;
> var Priority: DWORD;
> var Size: TSize;
> ColorDepth: DWORD;
> var Flags: DWORD): HResult; stdcall;
> function Extract(var BitmapHandle: HBITMAP): HResult; stdcall;
> end;
>
> IRunnableTask = interface
> ['{85788D00-6807-11D0-B810-00C04FD706EC}']
> function Run: HResult; stdcall;
> function Kill(fWait: BOOL): HResult; stdcall;
> function Suspend: HResult; stdcall;
> function Resume: HResult; stdcall;
> function IsRunning: Longint; stdcall;
> end;
>
> const
> { from ShlObjIdl.h }
> ITSAT_MAX_PRIORITY = 2;
> ITSAT_MIN_PRIORITY = 1;
> ITSAT_DEFAULT_PRIORITY = 0;
>
> IEI_PRIORITY_MAX = ITSAT_MAX_PRIORITY;
> IEI_PRIORITY_MIN = ITSAT_MIN_PRIORITY;
> IEIT_PRIORITY_NORMAL = ITSAT_DEFAULT_PRIORITY;
>
> IEIFLAG_ASYNC = $001; // ask the extractor if it supports ASYNC
> extract
> // (free threaded)
> IEIFLAG_CACHE = $002; // returned from the extractor if it does NOT
> cache
> // the thumbnail
> IEIFLAG_ASPECT = $004; // passed to the extractor to beg it to render
> to
> // the aspect ratio of the supplied rect
> IEIFLAG_OFFLINE = $008; // if the extractor shouldn't hit the net to get
> // any content needs for the rendering
> IEIFLAG_GLEAM = $010; // does the image have a gleam? this will be
> // returned if it does
> IEIFLAG_SCREEN = $020; // render as if for the screen (this is
> exlusive
> // with IEIFLAG_ASPECT )
> IEIFLAG_ORIGSIZE = $040; // render to the approx size passed, but crop if
> // neccessary
> IEIFLAG_NOSTAMP = $080; // returned from the extractor if it does NOT
> want
> // an icon stamp on the thumbnail
> IEIFLAG_NOBORDER = $100; // returned from the extractor if it does NOT
> want
> // an a border around the thumbnail
> IEIFLAG_QUALITY = $200; // passed to the Extract method to indicate that
> // a slower, higher quality image is desired,
> // re-compute the thumbnail
>
> {$IFDEF DELPHI3}
> // Delphi 3 SysUtils does not have this function
> function ExcludeTrailingBackslash(const Src: string): string;
> {$ENDIF}
>
> // IShellFolder methods helper
> procedure ShellFolderBindToObject(const ShellFolder: IShellFolder;
> PIDL: PItemIDList; const riid: TGUID; out pv);
> function ShellFolderGetUIObjectOf(const ShellFolder: IShellFolder;
> cidl: DWORD; var PIDL: PItemIDList; riid: TGUID; out pv): Boolean;
> procedure ShellFolderParseDisplayName(const ShellFolder: IShellFolder;
> const DisplayName: string; out PIDL: PItemIDList);
> function ShellFolderGetExtractImage(const ShellFolder: IShellFolder;
> const RelativeFileName: string; Malloc: IMalloc;
> out XtractImage: IExtractImage): Boolean;
>
> function GetExtractImageItfPtr(const FileName: string;
> out XtractImage: IExtractImage): Boolean;
> function GetFileLargeIcon(const FileName: string;
> out LargeIcon: TIcon): Boolean;
> function ExtractImageGetFileThumbnail(const XtractImage: IExtractImage;
> ImgWidth, ImgHeight, ImgColorDepth: Integer; var Flags: DWORD; Bmp:
> TBitmap;
> out RunnableTask: IRunnableTask): Boolean;
> function GetSysImgListIndex(const FileName: string): Integer;
> procedure GetShellFolderItfPtr(const FolderName: string; Malloc: IMalloc;
> out TargetFolder: IShellFolder);
> function GetBitmapFromFile(const FileName: String): TGraphic;
>
> implementation
>
> uses SysUtils, ComObj;
>
> {$IFDEF DELPHI3}
> function ExcludeTrailingBackslash(const Src: string): string;
> begin
> Result := Src;
> if AnsiLastChar(Result) = '\' then
> SetLength(Result, Pred(Length(Result)));
> end;
> {$ENDIF DELPHI3}
>
> procedure ShellFolderBindToObject(const ShellFolder: IShellFolder;
> PIDL: PItemIDList; const riid: TGUID; out pv);
> begin
> OleCheck(ShellFolder.BindToObject(PIDL, nil, riid,
> {$IFDEF DELPHI3}Pointer(pv){$ELSE}pv{$ENDIF}));
> end;
>
> function ShellFolderGetUIObjectOf(const ShellFolder: IShellFolder;
> cidl: DWORD; var PIDL: PItemIDList; riid: TGUID; out pv): Boolean;
> begin
> Result := NOERROR = ShellFolder.GetUIObjectOf(0, cidl, PIDL,
> riid, nil, {$IFDEF DELPHI3}Pointer(pv){$ELSE}pv{$ENDIF});
> end;
>
> procedure ShellFolderParseDisplayName(const ShellFolder: IShellFolder;
> const DisplayName: string; out PIDL: PItemIDList);
> var
> Attributes, Eaten: DWORD;
> begin
> OleCheck(ShellFolder.ParseDisplayName(0, nil,
> PWideChar(WideString(DisplayName)), Eaten, PIDL, Attributes));
> end;
>
> function ShellFolderGetExtractImage(const ShellFolder: IShellFolder;
> const RelativeFileName: string; Malloc: IMalloc;
> out XtractImage: IExtractImage): Boolean;
> var
> PIDL: PItemIDList;
> begin
> ShellFolderParseDisplayName(ShellFolder, RelativeFileName, PIDL);
> Result := ShellFolderGetUIObjectOf(ShellFolder, 1, PIDL,
> IExtractImage, XtractImage);
> Malloc.Free(PIDL);
> end;
>
> function GetExtractImageItfPtr(const FileName: string;
> out XtractImage: IExtractImage): Boolean;
> var
> TargetFolder: IShellFolder;
> FilePath: string;
> ItemIDList: PItemIDList;
> Malloc: IMalloc;
> begin
> FilePath := ExcludeTrailingBackslash(ExtractFilePath(FileName));
> OleCheck(SHGetMalloc(Malloc));
> GetShellFolderItfPtr(FilePath, Malloc, TargetFolder);
> ShellFolderParseDisplayName(TargetFolder, ExtractFileName(FileName),
> ItemIDList);
> try
> Result := ShellFolderGetUIObjectOf(TargetFolder, 1, ItemIDList,
> IExtractImage, XtractImage);
> finally
> Malloc.Free(ItemIDList);
> end;
> end;
>
> function GetFileLargeIcon(const FileName: string; out LargeIcon: TIcon):
> Boolean;
> var
> SFI: TSHFileInfo;
> begin
> if 0 <> SHGetFileInfo(PChar(FileName), FILE_ATTRIBUTE_ARCHIVE, SFI,
> sizeof(SFI), SHGFI_ICON or SHGFI_LARGEICON) then
> begin
> LargeIcon := TIcon.Create;
> LargeIcon.Handle := SFI.hIcon;
> Result := True;
> end else
> Result := False;
> end;
>
> function ExtractImageGetFileThumbnail(const XtractImage: IExtractImage;
> ImgWidth, ImgHeight, ImgColorDepth: Integer; var Flags: DWORD; Bmp:
> TBitmap;
> out RunnableTask: IRunnableTask): Boolean;
> var
> Size: TSize;
> Buf: array[0..MAX_PATH] of WideChar;
> BmpHandle: HBITMAP;
> Priority: DWORD;
> GetLocationRes: HRESULT;
>
> procedure FreeAndNilBitmap;
> begin
> {$IFNDEF DELPHI3}
> FreeAndNil(Bmp);
> {$ELSE}
> Bmp.Free;
> Bmp := nil;
> {$ENDIF}
> end;
>
> begin
> Result := False;
> RunnableTask := nil;
> Size.cx := ImgWidth;
> Size.cy := ImgHeight;
> Priority := IEIT_PRIORITY_NORMAL;
> Flags := Flags or IEIFLAG_ASYNC;
> GetLocationRes := XtractImage.GetLocation(Buf, sizeof(Buf), Priority,
> Size,
> ImgColorDepth, Flags);
>
> if (GetLocationRes = NOERROR) or (GetLocationRes = E_PENDING) then
> begin
> if GetLocationRes = E_PENDING then
> begin
> { if QI for IRunnableTask succeed, we can use RunnableTask
> interface pointer later to kill running extraction process.
> We could spawn a new thread here to extract image. }
> if S_OK <> XtractImage.QueryInterface(IRunnableTask, RunnableTask)
> then
> RunnableTask := nil;
> end;
>
> try
> OleCheck(XtractImage.Extract(BmpHandle)); // This could consume a long
> time.
> // If RunnableTask is
> available
> // then calling Kill()
> method
> // will immediately abort
> the process.
> Bmp.Handle := BmpHandle;
> Result := True;
> except
> on E: EOleSysError do
> begin
> // -------------
> OutputDebugString(PChar(string(E.ClassName) + ': ' + E.Message));
> // -------------
> FreeAndNilBitmap;
> Result := False;
> end
> else
> begin
> FreeAndNilBitmap;
> raise;
> end;
> end; { try/except }
> end;
> end;
>
> function GetSysImgListIndex(const FileName: string): Integer;
> var
> SFI: TSHFileInfo;
> begin
> SHGetFileInfo(PChar(FileName), 0, SFI, sizeof(TSHFileInfo),
> SHGFI_SYSICONINDEX);
> Result := SFI.iIcon;
> end;
>
> procedure GetShellFolderItfPtr(const FolderName: string; Malloc: IMalloc;
> out TargetFolder: IShellFolder);
> var
> DesktopFolder: IShellFolder;
> ItemIDList: PItemIDList;
> begin
> OleCheck(SHGetDesktopFolder(DesktopFolder));
> ShellFolderParseDisplayName(DesktopFolder, FolderName, ItemIDList);
> try
> ShellFolderBindToObject(DesktopFolder, ItemIDList, IShellFolder,
> TargetFolder);
> finally
> Malloc.Free(ItemIDList);
> end;
> end;
>
> //*******************************************************
>
> function GetBitmapFromFile(const FileName: String): TGraphic;
> var
> XtractImage: IExtractImage;
> Bmp: TBitmap;
> Icon: TIcon;
> ColorDepth: Integer;
> Flags: DWORD;
> RT: IRunnableTask;
> begin
> Flags := DWORD(IEIFLAG_OFFLINE) or DWORD(IEIFLAG_SCREEN);
> ColorDepth := 32;
>
> Result := nil;
> Icon := nil;
> Bmp := TBitmap.Create;
> try
> if GetFileLargeIcon(FileName, Icon) then
> Result := Icon;
>
> if GetExtractImageItfPtr(FileName, XTractImage) and
> // (not AnsiEndsStr('.dwg', FileName)) and
> ExtractImageGetFileThumbnail(XtractImage, 100, 100, ColorDepth,
> Flags, Bmp, RT) then
> begin
> Result := Bmp;
> Icon.Free;
> end
> else
> Bmp.Free;
> except
> end;
> end;
>
> end.
>
> {----------------------------------------------------------
> Unit Name: ShellObjHelper
> Author : hans gulo (HG)
> Purpose : Shell Object helper routines
> Purpose : Demo application's main unit for retrieving IExtractImage
> interface
> pointer from Windows Shell folder to crete thumbnail image.
> This code is a complementary for Delphi3000.com article at
> http://www.delphi3000.com/articles/article_3806.asp 
> <http://www.delphi3000.com/articles/article_3806.asp>
> ----------------------------------------------------------}
>
> [As partes desta mensagem que não continham texto foram removidas]
>
> .
>
> 

Responder a