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

上面的代碼會導致很多錯誤,在Delphi中,不能運行兩次...如何在Windows桌面上創建文件快捷方式(* .lnk文件)?

任何想法?

Btw。來源並不是我的原始資料,而是從網絡上的地方找到的。

+3

沒有問題,但你的陣列應該是0..MAX_PATH-1 –

回答

11

我會做例如獲得特殊的文件夾位置,創建快捷方式(鏈接)這樣

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

我覺得你施放刺成pwidechar犯了一個錯誤......這是行不通的,直到我說這個: LINKNAME :string; WLinkName:widetring; myWideCharPtr:PWideChar; InFolder:char的數組[0..MAX_PATH-1]; 然後 WLinkName:= LINKNAME; myWideCharPtr:= Addr(WLinkName [1]);如果不是FileExists(LinkName)則 如果IPFile.Save(myWideCharPtr,False)= S_OK,則 結果:= True;如果不存在則返回 。 – nagylzs

+0

在德爾福7與@nagylzs的變化工作。 – tuxar

0

功能,以及更多可以在100多個程序和功能的免費軟件dsiWin32庫中找到。請下載http://gp.17slon.com/gp/dsiwin32.htm並感謝Primoz Gabrijelcic和Delphi-SI社區提供的幫助。

最大

相關問題