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.
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.
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;
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.