其实是两个问题:
1、如何取得桌面、开始菜单、启动菜单所在的目录?如果是win2000,如何取得当前用户及公共用户的这些目录?
2、如何在任意指定目录下建立快捷方式?

解决方案 »

  1.   

    uses Shlobj;var
      s: string;
    begin
      SetLength(s, MAX_PATH);
      SHGetSpecialFolderPath(Handle, PChar(s), CSIDL_COMMON_DESKTOPDIRECTORY, False);
      ShowMessage(Trim(s));  // Trim(s)为所取得的目录
    end;
    其中第三个参数:
    CSIDL_COMMON_DESKTOPDIRECTORY、CSIDL_COMMON_STARTMENU、CSIDL_COMMON_STARTUP
    CSIDL_DESKTOPDIRECTORY、CSIDL_STARTMENU、CSIDL_STARTUP
    上面分别为公共用户和当前用户的桌面、开始菜单、启动菜单的目录。
      

  2.   

    //在桌面上建立快捷方式
    procedure TForm1.Button1Click(Sender: TObject);
    var
    tmpObject : IUnknown;
    tmpSLink : IShellLink;
    tmpPFile : IPersistFile;
    PIDL : PItemIDList;
    StartupDirectory : array[0..MAX_PATH] of Char;
    StartupFilename : String;
    LinkFilename : WideString;
    begin
    StartupFilename := 'c:\windows\notepad.exe';
    tmpObject := CreateComObject(CLSID_ShellLink);//创建建立快捷方式的外壳扩展
    tmpSLink := tmpObject as IShellLink;//取得接口
    tmpPFile := tmpObject as IPersistFile;//用来储存*.lnk文件的接口
    tmpSLink.SetPath(pChar(StartupFilename));//设定notepad.exe所在路径
    tmpSLink.SetWorkingDirectory(pChar(ExtractFilePath(StartupFilename)));//设定工作目录
    SHGetSpecialFolderLocation(0,
    CSIDL_DESKTOPDIRECTORY,
    PIDL);//获得桌面的Itemidlist
    SHGetPathFromIDList(PIDL,
    StartupDirectory);//获得桌面路径
    LinkFilename := StartupDirectory + '\MyNotepad.lnk';
    tmpPFile.Save(pWChar(LinkFilename),FALSE);//保存*.lnk文件
    end; 你可以把StartupDirectory设成你所要的目录。
      

  3.   

    上面同样要 uses Shlobj;