Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Diferenciar accesos directos. (https://www.clubdelphi.com/foros/showthread.php?t=60241)

rauros 25-09-2008 15:20:13

Diferenciar accesos directos.
 
Saludos a tod@s. He hecho un explorador para sustituir al de windows, ya que siempre he usado xp y al pasarme a vista no encuentro nunca nada de lo que quiero, así que me acostumbro a usar mi programa que lo puedo usar en todas las plataformas. Pero haciendo el explorador he llegado a un problema. He divido los componentes de los datos en dos: Carpetas y Archivos. Las carpetas las procesa mi programa, y los archivos los ejecuta con shellexecute. Pero hay un programa que abre carpetas, el famoso acceso directo. La solución, abro la carpeta hacia el acceso directo. NO. Error, ya que el acceso directo también puede ir relacionado con un archivo. Conclusión, necesito saber como diferenciar entre un acceso directo de archivo, y uno de carpeta. Y en el segndo caso, como poder saber el camino de la carpeta vinculada.

TOPX 25-09-2008 15:38:50

Saludos,

Se puede validar desde la info que extrae el ejemplo en http://delphi.about.com/od/windowssh.../aa072704a.htm

rauros 25-09-2008 16:42:07

Da lectura de memoria 0 en la siguiente línea:

Código Delphi [-]
CoCreateInstance(CLSID_ShellLink,
                  nil,
                  CLSCTX_INPROC_SERVER,
                  IShellLink,
                  psl);
 if psl.QueryInterface(IPersistFile, ppf) = 0 then // <----------------
 begin
   MultiByteToWideChar(CP_ACP,
                       MB_PRECOMPOSED,
                       PChar(LinkFileName),

rauros 26-09-2008 12:49:22

Con los breakpoints he detectado que el psl es nil, y supongo yo que eso significa que el puntero no tiene dirección de memoria. El problema es que yo nunca he usado IShellLink, intentaré crearlo a ver si funciona pero si no os aviso.

cHackAll 27-09-2008 16:28:37

Código Delphi [-]
 if LongBool(GetFileAttributes('C:\Archivos de programa') and $400{FILE_ATTRIBUTE_REPARSE_POINT}) then
  MessageBox(0, 'LNK', nil, 0);

rauros 27-09-2008 21:00:53

Y exactamente que hace eso?

Voy a ponerte desde mi punto de vista lo que pienso que hace:

Si coges los atributos de archivos de programa (por qué?) y parte desconocida por mí se genera el mensaje LNK.

TOPX 28-09-2008 05:00:21

Cita:

Empezado por rauros (Mensaje 316513)
El problema es que yo nunca he usado IShellLink

Es cierto, veo que puede que esa interface no aplique en su Win Vista... y como no tengo una instalación de eso por acá cerca, podría Ud. probar:
  1. o con IShellLinkW
    -
  2. o con el IPersistFile.Load que usan en la función GetShellLinkInfo de http://www.informit.com/articles/art...26940&seqNum=4
    -

cHackAll 29-09-2008 22:20:08

Cita:

Empezado por rauros (Mensaje 316788)
Y exactamente que hace eso?

Voy a ponerte desde mi punto de vista lo que pienso que hace:

Si coges los atributos de archivos de programa (por qué?) y parte desconocida por mí se genera el mensaje LNK.

Tienes mucha razón rauros, creo que me falla la "vista" pues no se desde qué momento me convencí que necesitabas reconocer a un "Symbolic Link", en todo caso "edito" :D

Código Delphi [-]
uses ActiveX, ComObj, ShlObj;
 
function GetShellLinkPath(FileName: string): string;
var ShellLink: IUnknown;
begin
 ShellLink := CreateComObject(CLSID_ShellLink);
 if (ShellLink as IPersistFile).Load(PWideChar(WideString(FileName)), STGM_READ) = 0 then
  begin
   SetLength(FileName, MAX_PATH);
   (ShellLink as IShellLink).GetPath(@FileName[1], MAX_PATH, PWin32FindData(0)^, SLGP_UNCPRIORITY);
   Result := PChar(@FileName[1]);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var FileName: PChar;
begin
 FileName := PChar(GetShellLinkPath('c:\Documents and Settings\666\Desktop\ClubDelphi.lnk'));
 if (FileName <> '') and LongBool(GetFileAttributes(FileName) and FILE_ATTRIBUTE_DIRECTORY) then
  if not SetCurrentDirectory(FileName) then
   MessageBox(Handle, PChar(SysErrorMessage(GetLastError)), nil, MB_ICONERROR);
end;

Saludos


La franja horaria es GMT +2. Ahora son las 06:54:45.

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