Mencionas que el archivo queda como
Código:
[.ShellClassInfo]
IconFile=E:\Administrador\Mis documentos\Nueva carpeta\casco
IconIndex=0
pero debería ser
Código:
[.ShellClassInfo]
IconFile=E:\Administrador\Mis documentos\Nueva carpeta\casco.ico
IconIndex=0
Al parecer hay un error en la extensión del archivo de ícono que deseas usar.
Como te dije antes el ícono no cambiará hasta que reinicies la máquina o refresques la caché de íconos de windows. Si no lo haces, es como que una vez que tuvieras cambiado el ícono de la carpeta y funcionando bien, editaras el archivo Desktop.ini con el block de notas, le cambiaras el ícono y lo volvieras a guardar. Evidentemente editarlo y cambiarlo con el block de notas
no cambiará el ícono de la carpeta, ya que windows no lee el archivo desktop.ini de la carpeta cada vez que la muestra, sino que lo hace solo la primera vez que accedes a él y luego lo coloca en una caché para recuperarlo rápidamente cada vez que se muestre dicha carpeta, y dicha caché se mantiene hasta que reinicies Windows o lo fuerces a refrescarse, o lo vacíes.
Para refrescar la caché de íconos se necesita de un procedimiento algo complicado, pero casualmente tengo el código que necesitas a mano:
Código Delphi
[-]uses ...,ShlObj, ComObj, Registry;
procedure RebuildIconCache;
...
implementation
const
sr_WindowMetrics='Control Panel\Desktop\WindowMetrics';
sr_ShellIconSize='Shell Icon Size';
...
procedure RebuildIconCache;
var
news,olds:string;
sz:integer;
reg:TRegistry;
Function UpdateAllWindowsCallback(WHandle : HWnd;
Var Parm : Pointer) :
Boolean; stdcall;
begin
SendMessage(WHandle,WM_SETTINGCHANGE,0,0);
Result:=True;
end;
Procedure UpdateAllWindows;
Begin
EnumWindows(@UpdateAllWindowsCallback,
WM_SETTINGCHANGE);
End;
function GetIconCacheFile:string;
begin
Result:=GetWindowsDir+'ShellIconCache';
end;
procedure DeleteIconCache;
var
sfile:string;
begin
sfile:=GetIconCacheFile;
if fileexists(sfile) then
begin
if deletefile(sfile)=false
then showmessage('Can not erase file: '+sfile);
end;
end;
function RefreshActiveDesktop:boolean;
const
CLSID_ActiveDesktop: TGUID
= '{75048700-EF1F-11D0-9888-006097DEACF9}';
var
ActiveDesktop: IActiveDesktop;
begin
try
ActiveDesktop := CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop;
ActiveDesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);
Result:=true;
except
Result:=false;
end;
end;
procedure RefreshDesktop;
var
wnd:THandle;
fl:boolean;
begin
fl:=RefreshActiveDesktop;
if fl=false then
begin
wnd:=FindWindow('Progman', 'Program Manager');
if wnd<>0 then SendMessage(wnd,WM_COMMAND,$A065,0)
else
UpdateAllWindows;
end;
end;
begin
reg:=TRegistry.Create;
try
deletefile(GetIconCacheFile);
reg.RootKey :=HKEY_CURRENT_USER;
reg.OpenKey(sr_WindowMetrics,false);
olds:=reg.ReadString(sr_ShellIconSize);
sz:=strtointdef(olds,32);
inc(sz);
news:=inttostr(sz);
Reg.WriteString(sr_ShellIconSize,news);
UpdateAllWindows;
if olds='' then olds:='32';
Reg.WriteString(sr_ShellIconSize,olds);
Reg.CloseKey;
Reg.Free;
UpdateAllWindows;
RefreshDeskTop;
finally
end;
end;
Te aconsejo que uses la forma que yo te indiqué antes para acceder y/o crear el archivo Desktop.ini, ya que si usas la de cHackAll verás que si el archivo ya fué creado mediante "Personalizar Carpeta" por Windows y tiene los atributos de Oculto te dará un error al intentar acceder al mismo
Deberás poner tu procedimiento así:
Código Delphi
[-]uses ..., inifiles;
procedure TForm1.Button1Click(Sender: TObject);
var archivo:TIniFile;
begin
archivo:=TIniFile.Create('C:\Carpeta a Personalizar\Desktop.ini');
archivo.WriteString('.ShellClassInfo','IconFile','E:\Administrador\Mis documentos\Nueva carpeta\Casco.ico');
archivo.WriteInteger('.ShellClassInfo','IconIndex',0);
archivo.Free;
RebuildIconCache;
end;
Espero que ahora sí puedas solucionar tu problema con los íconos.
Ya lo he probado y funciona de maravillas.