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

Yukarıdaki kod Delphi hatalar bir çok neden olur ve iki kez koşamam ...Windows'ta masaüstünde bir dosya kısayolu (* .lnk dosyası) nasıl oluşturulur?

Herhangi bir fikir?

B

Btw. Kaynak orijinal olarak benim değil, web üzerindeki yerlerden alındı.

+3

değil sorun ama diziler olmalıdır 0..MAX_PATH-1 Ben bu katma kadar ... O çalışma değildi Eğer pwidechar içine bir acı döküm yoluyla bir hata yaptım –

cevap

11

Bunu yapardım örn. Özel klasör konumlarını elde kısayolları (bağlantılar) oluşturmak için bu şekilde

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

: bağlantıadı : string; WLinkName: widestring; myWideCharPtr: PWideChar; InFolder: Char'ın dizisi [0..MAX_PATH-1]; ve sonra WLinkName: = LinkName; myWideCharPtr: = Addr (WLinkName [1]); eğer FileExists (LinkName) değilse, IPFile.Save (myWideCharPtr, False) = S_OK ise Sonuç: = Doğru; – nagylzs

+0

Delphi 7'de @nagylzs değişiklikleri ile çalışır. – tuxar

0

Fonksiyonlar ve çok daha fazlası kadar 100+ usul ve fonksiyonların ücretsiz dsiWin32 kütüphanesinde bulunabilir. http://gp.17slon.com/gp/dsiwin32.htm'dan indirin ve kullanılabilir hale getirmek için Primoz Gabrijelcic ve Delphi-SI topluluğu sayesinde teşekkürler.

Max

İlgili konular