【问题标题】:How to create a file shortcut (*.lnk file) on desktop in Windows?如何在 Windows 桌面上创建文件快捷方式(*.lnk 文件)?
【发布时间】:2011-10-09 14:39:31
【问题描述】:
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中导致很多错误,无法运行两次...

有什么想法吗?

顺便说一句。来源不是我的,是从网上找的。​​p>

【问题讨论】:

  • 不是问题,但你的数组应该是 0..MAX_PATH-1

标签: delphi delphi-2009


【解决方案1】:

我会这样做,例如这边

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;

【讨论】:

  • 我认为您将刺痛投射到 pwidechar 中犯了一个错误...直到我添加了以下内容才起作用: LinkName: string; WLinkName:宽字符串; myWideCharPtr : PWideChar; InFolder:Char数组[0..MAX_PATH-1];然后 WLinkName := LinkName; myWideCharPtr := Addr(WLinkName[1]);如果不是 FileExists(LinkName) 那么如果 IPFile.Save(myWideCharPtr, False) = S_OK 然后 Result := True;
【解决方案2】:

获取特殊文件夹位置、创建快捷方式(链接)等功能可以在包含 100 多个过程和函数的免费软件 dsiWin32 库中找到。在 http://gp.17slon.com/gp/dsiwin32.htm 下载它,感谢 Primoz Gabrijelcic 和 Delphi-SI 社区提供它。

最大

【讨论】:

    【解决方案3】:
    uses ShlObj, ActiveX, ComObj;
    ...
    procedure TForm1.Button1Click(Sender: TObject);
    var
    IObject : IUnknown;
    ISLink : IShellLink;
    IPFile : IPersistFile;`enter code here`
    PIDL : PItemIDList;
    InFolder : array[0..MAX_PATH] of Char;
    TargetName : String;
    LinkName : WideString;
    begin
    TargetName := 'C:\Windows\System32\calc.exe';
    
    {Use TargetName:=ParamStr(0) which
    returns the path and file name of the
    executing program to create a link to your
    Application}
    
    IObject := CreateComObject(CLSID_ShellLink);
    ISLink := IObject as IShellLink;
    IPFile := IObject as IPersistFile;
    
    with ISLink do begin
    SetPath(pChar(TargetName));
    SetWorkingDirectory
    (pChar(ExtractFilePath(TargetName)));
    end;
    
    // if we want to place a link on the Desktop
    SHGetSpecialFolderLocation
    (0, CSIDL_DESKTOPDIRECTORY, PIDL);
    SHGetPathFromIDList
    (PIDL, InFolder);
    
    {
    or if we want a link to appear in
    some other, not-so-special, folder:
    InFolder := 'c:\SomeFolder'
    }
    
    LinkName := InFolder + '\Delphi Created Link.lnk';
    IPFile.Save(PWChar(LinkName), false);
    end;
    

    来源:[http://www.delphipages.com/forum/showthread.php?t=46623][1]

    【讨论】:

      猜你喜欢
      • 2013-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2020-11-18
      相关资源
      最近更新 更多