Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-07-2008
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
Problema con procedimiento y paso de parametros

En la sección Trucos, me topé con este interesante truco para obtener cualquier thumbnail de la Shell, funciona perfecto, pero no logro adaptar un string a PWideChar, como para pasarle los parametros por variables, siempre me tira error, alguna idea?

Código Delphi [-]
 
uses ActiveX, ShlObj, ComObj;
type
 IExtractImage = interface ['{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}'] // http://msdn2.microsoft.com/en-us/lib...48(VS.85).aspx
  function GetLocation(pszPathBuffer: LPWSTR; cchMax: DWORD; 
 var pdwPriority: DWORD; const prgSize: SIZE; dwRecClrDepth: DWORD; 
 var pdwFlags: DWORD): HRESULT; stdcall;
  function Extract(var phBmpImage: HBITMAP): HRESULT; stdcall;
 end;
function GetThumbnail(lpPathName, lpFileName: PWideChar; Width, Height: Integer): TBitmap;
var
 Desktop, Folder: IShellFolder;
 ItemIDList: PItemIDList;
 Flags, Priority: Cardinal;
 ExtractImage: IExtractImage;
 Res: HRESULT;
 hBitmap: Windows.HBITMAP;
 Buffer: array[0..MAX_PATH-1] of WideChar;
 Size: TSize;
begin
 Result := nil;
 SHGetDesktopFolder(Desktop);
 if LongBool(Desktop.ParseDisplayName(0, nil, lpPathName, PDWORD(0)^, ItemIDList, PDWORD(0)^)) then Exit;
 Desktop.BindToObject(ItemIDList, nil, IShellFolder, Folder);
 CoTaskMemFree(ItemIDList);
 if LongBool(Folder.ParseDisplayName(0, nil, lpFileName, PDWORD(0)^, ItemIDList, PDWORD(0)^)) then Exit;
 Folder.GetUIObjectOf(0, 1, ItemIDList, IExtractImage, nil, ExtractImage);
 CoTaskMemFree(ItemIDList);
 if not Assigned(ExtractImage) then Exit; // TODO
 Size.cx := Width; Size.cy := Height; Priority := 0;
 Flags := $28{IEIFLAG_SCREEN+IEIFLAG_OFFLINE};
 Res := ExtractImage.GetLocation(Buffer, SizeOf(Buffer), Priority, Size, 24{pf32bit}, Flags);
 if (Res = NOERROR) or (Res = E_PENDING{IEIFLAG_ASYNC}) then
  begin
   if not LongBool(ExtractImage.Extract(hBitmap)) then
    begin
     Result := TBitmap.Create;
     Result.Handle := hBitmap;
    end;
  end;
end;
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;

Última edición por dec fecha: 29-07-2008 a las 15:50:07.
Responder Con Cita
  #2  
Antiguo 29-07-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cuando hablemos de errores, es bien que se especifiquen los mensajes de error correspondientes, porque, esto ayudará, como se sabe, a encontrar una posible solución al problema. En este caso, y, si se trata sólo de convertir un "string" a "WideChar", si no me equivoco, es posible usar un "cast", sencillamente:

Código Delphi [-]
var
  s: string;
  wc: PWideChar;
begin
  s := 'This is a string';
  wc := PWideChar(s);
  (* ... *)
end;
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 29-07-2008
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
SOLUCIONADO

El problema estaba en que en la funcion para obtener el thumbnails, el parametro esta apuntado hacia un pointer, por lo que la unica forma de poder pasarle los parametros correctamente, fue trabajando sobre el vector:

Código Delphi [-]
var MiWideChar:array[0..255] of WideChar;
     a,d,ruta:string;
     ar,di:PWideChar;
begin
   a:=ExtractFileName(Lista.Strings[w]);
   ar:=StringToWideChar((a),archivo,255);
   d:=ExtractFilePath(Lista.Strings[w]);
   di:=StringToWideChar(d,directorio,255);
   Image1.Picture.Assign(GetThumbnail(di,ar, 96, 96));
end;
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Paso de parametros Delphos Varios 4 18-01-2005 15:32:07
paso de parametros empty API de Windows 1 11-05-2004 11:42:13
Paso de parametros senpiterno Varios 1 11-04-2004 03:44:17
Paso de parametros __cadetill PHP 2 12-08-2003 10:15:09
Paso de Parámetros vinny Varios 1 29-05-2003 12:54:07


La franja horaria es GMT +2. Ahora son las 23:13:54.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi