Bug dans TOpenDialog : ofNoDereferenceLinks sans effet.

Signaler
Messages postés
15
Date d'inscription
vendredi 10 janvier 2003
Statut
Membre
Dernière intervention
9 novembre 2009
-
Messages postés
15
Date d'inscription
vendredi 10 janvier 2003
Statut
Membre
Dernière intervention
9 novembre 2009
-
Bonjour à tous,

Mon besoin est de récupérer au moyen d'un TOpenDialog (filtré sur *.lnk), le fichier visé par le raccourci afin de l'utiliser via un ShellExecute.

Donc, si j'ai bien saisi, indiquer le flag ofNoDereferenceLinks dans un TOpenDialog force la boîte à renvoyer le nom du raccourci et non le nom du fichier/dossier auquel le raccourci fait reférence.

Mais quel que soit l'état de ce flag, la boîte renvoie systématiquement le bidule.lnk

Bizarrement, la chose fontionnait correctement il y a quelques jours, j'ai vérifié la version de commdlg32.dll, cherché de partout sur le net, et rien, aucune piste...

Ps : j'ai même reécrit mon code pour n'utiliser que les API, mais mêmes résultats.

Help !!

fa

3 réponses

Messages postés
1724
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2020
6
Salut,

Je constate la même chose (sous D4 pro) : que je mette ou pas [ofNoDereferenceLinks] à true ne change rien au comportement du TOpenDialog qui retourne toujours le path du raccourci en FileName. A se demander si cette option a un jour fonctionné ???

Moi à ta place, je ne me prendrais pas la tête avec ça. J'utiliserais une fonction retournant le chemin contenue dans le fichier *.link.

A +
Messages postés
1724
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2020
6
Tiens, essaye ça.

Je crée une TOpenDialog à chaque fois (et je le détruis), car pour une raison qui m'échappe, InitialDir se positionne dans le path du raccourci et ne peut jamais être réinitialisé...

Donc :

uses ShlObj, ComObj, ActiveX; // Dialogs

function GetPathFromLink(const Link: string): string;
var
  AnObj  : IUnknown;
  ShLink : IShellLink;
  PFile  : IPersistFile;
  pfd    : TWin32FindData;
begin
  Result := Link;
  AnObj := CreateComObject(CLSID_ShellLink);
  ShLink := AnObj as IShellLink;
  PFile := AnObj as IPersistFile;
  if PFile.Load(Pointer(WideString(Result)), OF_READ) <> S_OK then
    Exit;
  ShLink.GetPath(PChar(Result), MAX_PATH, pfd, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TOpenDialog.Create(Self) do
  try
    Filter := 'Raccourcis (*.lnk)|*.lnk';
    InitialDir := 'D:\Documents and Settings\UserName\SendTo\';
    if Execute then
      Label1.Caption := GetPathFromLink(FileName);
  finally
    Free;
  end;
end;

Bonne prog'
Messages postés
15
Date d'inscription
vendredi 10 janvier 2003
Statut
Membre
Dernière intervention
9 novembre 2009

Merci,

j'utilise moi aussi par défaut la méthode avec IShellLink, mais j'espérais réduire encore un peu la taille de mon log en utilisant le moins d'uses possible....




M'enfin, c'est quand même bizarre que cette library ne fonctionne pas correctement.



fa