2011-10-09 16 views
7
function GetDesktopFolder: string; 
var 
    buf: array[0..MAX_PATH] of Char; 
    pidList: PItemIDList; 
begin 
    Result := StrNoDesktopFolderFo; 
    SHGetSpecialFolderLocation(Application.Handle, CSIDL_DESKTOP, pidList); 
    if (pidList <> nil) then 
    if (SHGetPathFromIDList(pidList, buf)) then 
     Result := buf; 
end; 

procedure p; 
var 
    i: Integer; 
    IObject: IUnknown; 
    ISLink: IShellLink; 
    IPFile: IPersistFile; 
    PIDL: PItemIDList; 
    InFolder: array[0..MAX_PATH] of Char; 
    TargetName: string; 
    LinkName: string; 
begin 
    TargetName := 'c:\folder\exeFile.exe';//hardcoded example 

    IObject := CreateComObject(CLSID_ShellLink) ; 
    ISLink := IObject as IShellLink; 
    IPFile := IObject as IPersistFile; 

    with ISLink do 
    begin 
    SetDescription('what ever'); 
    SetPath(pChar(TargetName)) ; 
    SetWorkingDirectory(pChar(ExtractFilePath(TargetName))) ; 
    end; 

    SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, PIDL) ; 
    SHGetPathFromIDList(PIDL, InFolder) ; 

    LinkName := getDesktopFolder+'\'; 
    i := ; 

    LinkName:= linkname+ExtractFileName(TargetName)+'.lnk'; 

    if LinkName = StrNoDesktopFolderFo then 
    Exit; 
    if not FileExists(LinkName) then 
    IPFile.Save(PWChar(LinkName), False); 

    Application.Terminate; 
end; 

El código anterior hace que una gran cantidad de errores en Delphi y no puede correr el doble ...Cómo crear un acceso directo a archivos (archivo * .lnk) en el escritorio en Windows?

¿Alguna idea?

Btw. la fuente no es originalmente mía, fue recogida de lugares en la web.

+3

no es el problema, pero las matrices deben ser 0..MAX_PATH-1 –

Respuesta

11

Lo haría, p. de esta manera

uses 
    ShlObj, ComObj, ActiveX; 

function GetDesktopFolder: string; 
var 
    PIDList: PItemIDList; 
    Buffer: array [0..MAX_PATH-1] of Char; 
begin 
    Result := ''; 
    SHGetSpecialFolderLocation(Application.Handle, CSIDL_DESKTOP, PIDList); 
    if Assigned(PIDList) then 
    if SHGetPathFromIDList(PIDList, Buffer) then 
     Result := Buffer; 
end; 

function CreateDesktopShellLink(const TargetName: string): Boolean; 
var 
    IObject: IUnknown; 
    ISLink: IShellLink; 
    IPFile: IPersistFile; 
    PIDL: PItemIDList; 
    LinkName: string; 
    InFolder: array [0..MAX_PATH-1] of Char; 
begin 
    Result := False; 

    IObject := CreateComObject(CLSID_ShellLink); 
    ISLink := IObject as IShellLink; 
    IPFile := IObject as IPersistFile; 

    with ISLink do 
    begin 
    SetDescription('Description ...'); 
    SetPath(PChar(TargetName)); 
    SetWorkingDirectory(PChar(ExtractFilePath(TargetName))); 
    end; 

    SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, PIDL); 
    SHGetPathFromIDList(PIDL, InFolder) ; 

    LinkName := IncludeTrailingBackslash(GetDesktopFolder); 
    LinkName := LinkName + ExtractFileName(TargetName) + '.lnk'; 

    if not FileExists(LinkName) then 
    if IPFile.Save(PWideChar(LinkName), False) = S_OK then 
     Result := True; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if CreateDesktopShellLink('C:\Folder\ExeFile.exe') then 
    ShowMessage('Link has been created ...'); 
end; 
+1

Creo que cometió un error echando una picadura en PWideChar ... No estaba funcionando hasta que añadí esto: LinkName : cuerda; WLinkName: widestring; myWideCharPtr: PWideChar; InFolder: array [0..MAX_PATH-1] de Char; y luego WLinkName: = LinkName; myWideCharPtr: = Addr (WLinkName [1]); si no FileExists (LinkName) luego if IPFile.Save (myWideCharPtr, False) = S_OK then Resultado: = Verdadero; – nagylzs

+0

En Delphi 7 funciona con los cambios de @nagylzs. – tuxar

0

Funciones para la obtención de lugares especiales de carpetas, creación de accesos directos (enlaces), y mucho más se puede encontrar en la biblioteca dsiWin32 gratuita de más de 100 procedimientos y funciones. Descárguelo en http://gp.17slon.com/gp/dsiwin32.htm y gracias a Primoz Gabrijelcic y la comunidad Delphi-SI por ponerlo a disposición.

Max

Cuestiones relacionadas