2011-10-09 17 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; 

Il codice sopra provoca un sacco di errori in Delphi e non può essere eseguito due volte ...Come creare un collegamento al file (file * .lnk) sul desktop in Windows?

Tutte le idee?

Btw. la fonte non è originariamente mia, è stata prelevata dai luoghi sul web.

+3

non è il problema, ma gli array dovrebbero essere 0..MAX_PATH-1 –

risposta

11

Lo farei ad es. in questo modo

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

Penso che hai fatto un errore lanciando una puntura in PWideChar ... Non funzionava fino a quando ho aggiunto questo: LinkName : stringa; WLinkName: widestring; myWideCharPtr: PWideChar; InFolder: array [0..MAX_PATH-1] di Char; e quindi WLinkName: = LinkName; myWideCharPtr: = Addr (WLinkName [1]); se non FileExists (LinkName) quindi se IPFile.Save (myWideCharPtr, False) = S_OK quindi Risultato: = True; – nagylzs

+0

In Delphi 7 funziona con le modifiche di @nagylzs. – tuxar

0

Funzioni per l'ottenimento di luoghi speciali cartelle, la creazione di collegamenti (link), e molto altro ancora può essere trovato nella freeware libreria dsiWin32 di oltre 100 procedure e funzioni. Scaricalo allo http://gp.17slon.com/gp/dsiwin32.htm e grazie a Primoz Gabrijelcic e alla comunità Delphi-SI per averlo reso disponibile.

Max

Problemi correlati