2 votos

convertir función a delphi 2010 (unicode)

¿Cómo convertir esta función a Delphi 2010 (Unicode)?

function TForm1.GetTarget(const LinkFileName:String):String;
var
   //Link : String;
   psl  : IShellLink;
   ppf  : IPersistFile;
   WidePath  : Array[0..260] of WideChar;
   Info      : Array[0..MAX_PATH] of Char;
   wfs       : TWin32FindData;
begin
  if UpperCase(ExtractFileExt(LinkFileName)) <> '.LNK' Then
  begin
    Result:='NOT a shortuct by extension!';
    Exit;
  end;

  CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, psl);
  if psl.QueryInterface(IPersistFile, ppf) = 0 Then
  Begin
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PAnsiChar(LinkFileName), -1, @WidePath, MAX_PATH);
    ppf.Load(WidePath, STGM_READ);
    psl.GetPath((@info), MAX_PATH, wfs, SLGP_UNCPRIORITY);
    Result := info;

  end
  else
    Result := '';
end;

Gracias

1voto

Michael Madsen Puntos 30610

Hasta donde yo sé, ppf.Load debería ser capaz de tomar tu LinkFileName directamente con un cast a PChar (que ahora es PWideChar). Eliminar la línea MultiByteToWideChar y utilizar PChar(LinkFileName) en lugar de copiar a una variable temporal debería funcionar.

Esto haría que el código se viera así:

function TForm1.GetTarget(const LinkFileName:String):String;
var
   //Link : String;
   psl  : IShellLink;
   ppf  : IPersistFile;
   //WidePath  : Array[0..260] of WideChar;
   Info      : Array[0..MAX_PATH] of Char;
   wfs       : TWin32FindData;
begin
  if UpperCase(ExtractFileExt(LinkFileName)) <> '.LNK' Then
  begin
    Result:='NOT a shortuct by extension!';
    Exit;
  end;

  CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, psl);
  if psl.QueryInterface(IPersistFile, ppf) = 0 Then
  Begin
    ppf.Load(PChar(LinkFileName), STGM_READ);
    psl.GetPath((@info), MAX_PATH, wfs, SLGP_UNCPRIORITY);
    Result := info;    
  end
  else
    Result := '';
end;

psl.GetPath está declarado como usando un LPTSTR en MSDN, así que creo que deberías obtener la versión Unicode sin cambiar esa parte.

1voto

mghie Puntos 25960

He hecho algunos cambios más a la respuesta de Michael para utilizar la conversión adecuada de cadenas a mayúsculas, comprobar las condiciones de error y eliminar cosas innecesarias:

function TForm1.GetTarget(const LinkFileName: String): String;
var
  psl: IShellLink;
  ppf: IPersistFile;
  wfs: TWin32FindData;
begin
  if Character.ToUpper(ExtractFileExt(LinkFileName)) <> '.LNK' Then
    Exit('NOT a shortcut by extension!');

  OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER,
    IShellLink, psl));
  if psl.QueryInterface(IPersistFile, ppf) = 0 Then
  Begin
    OleCheck(ppf.Load(PChar(LinkFileName), STGM_READ));
    SetLength(Result, MAX_PATH);
    OleCheck(psl.GetPath(PChar(Result), MAX_PATH, wfs, SLGP_UNCPRIORITY));
    Result := PChar(Result);
  end;
end;

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X