1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| Var hRes : hResult;
BufferChemin : Array [0..MAX_PATH] of Char;
Memory : PIMalloc;
pIdL : LPITEMIDLIST;
SL : pIShellLink;
PF : pIPersistFile;
w : Array [0..MAX_PATH] of WChar;
szChemin : Array [0..MAX_PATH] of Char;
Win32FindData : tWin32FindData;
Procedure RECHERCHE_RECURSIVE;
Begin
...
{ Lorsqu'un fichier *.lnk est trouvé, BufferChemin est son path }
MultiByteToWideChar(CP_ACP,0,BufferChemin,-1,@w,SizeOf(w));
if PF^.Vtbl^.Load(PF,@w,STGM_READWRITE) = S_OK then
begin
if SL^.Vtbl^.Resolve(SL,0,SLR_NO_UI or SLR_UPDATE) = S_OK then
begin
{ 1. Modification du chemin }
if SL^.Vtbl^.GetPath(SL,szChemin,SizeOf(szChemin),Win32FindData,SLGP_RAWPATH) = S_OK then
begin
...
{ Modification de szChemin }
...
SL^.Vtbl^.SetPath(SL,szChemin); <=== RENVOIE S_FALSE
end;
{ 2. Modification du dossier de travail }
if SL^.Vtbl^.GetWorkingDirectory(SL,szChemin,SizeOf(szChemin)) = S_OK then
begin
...
{ Modification de szChemin }
...
SL^.Vtbl^.SetWorkingDirectory(SL,szChemin); <=== ET ICI C'EST OK
end;
{ 3. Enregistrement des changements }
PF^.Vtbl^.Save(PF,Nil,False);
end;
end;
...
End;
Begin { Main }
if CoInitialize(Nil) = S_OK then
begin
if CoCreateInstance(CLSID_ShellLink,Nil,CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER,IID_IShellLink,SL) = S_OK then
begin
if SL^.Vtbl^.QueryInterface(SL,IID_IPersistFile,PF) = S_OK then
begin
if SHGetMalloc(@Memory) = NOERROR then
begin
SHGetSpecialFolderLocation(0,CSIDL_DESKTOPDIRECTORY,pIdL);
if pIdL <> Nil then
begin
SHGetPathFromIDList(pIdL,BufferChemin);
{ Recherche de tous les fichiers *.lnk }
RECHERCHE_RECURSIVE(BufferChemin);
Memory^.Vtbl^.Free(Memory,pIdL);
end;
Memory^.Vtbl^.Release(Memory);
end;
PF^.Vtbl^.Release(PF);
end;
SL^.Vtbl^.Release(SL);
end;
CoUninitialize;
end;
End. |
Partager