Bug dans TOpenDialog : ofNoDereferenceLinks sans effet.

cs_fadiese Messages postés 15 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 9 novembre 2009 - 29 juin 2007 à 16:03
cs_fadiese Messages postés 15 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 9 novembre 2009 - 30 juin 2007 à 10:44
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

japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
29 juin 2007 à 21:25
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 +
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
29 juin 2007 à 22:55
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'
0
cs_fadiese Messages postés 15 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 9 novembre 2009
30 juin 2007 à 10:44
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
0
Rejoignez-nous