uses shlobj, ActiveX, ComObj, ShellAPI;function ExeFromLink(const linkname: WideString): string;
var
  link: IShellLink;
  storage: IPersistFile;
  filedata: TWin32FindData;
  buf: array[0..MAX_PATH] of Char;
  widepath: WideString;
begin
  OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER,
    IShellLink, link));
  OleCheck(link.QueryInterface(IPersistFile, storage));
  widepath := linkname;
  Result := '';
  if Succeeded(storage.Load(@widepath[1], STGM_READ)) then
    if Succeeded(link.Resolve(GetActiveWindow, SLR_NOUPDATE)) then
      if Succeeded(link.GetPath(buf, sizeof(buf), filedata, SLGP_UNCPRIORITY))
        then
        Result := buf;
  storage := nil;
  link := nil;
end;procedure TForm1.btn1Click(Sender: TObject);
var
  s: string;
begin
  s := ExeFromLink('d:\记事本.lnk');
  if s <> '' then
  begin
    ShellExecute(Handle, 'open', PChar(s), '', '', SW_SHOWNORMAL);
  end
  else
    ShowMessage('快捷方式指向的路径无效');
end;

解决方案 »

  1.   

    @sololie 
    运行那个 快捷方式的 记事本.lnk 是可以的,但是运行其他的就不行了呀
    比方说: 我建立一个IE的快捷方式是直接打开 百度网站 ,参数设置如下:这个快捷方式也放在D盘下
    我修改后的代码如下,可是不能执行这个快捷方式,打开的还是 默认网站的???
    procedure TForm1.btn1Click(Sender: TObject);
    var
      s: string;
    begin
      s := ExeFromLink('d:\Internet Explorer.lnk');
       if s <> '' then  
      begin
          ShellExecute(Handle, 'open', PChar(s), '', '', SW_SHOWNORMAL);
       end 
      else 
       ShowMessage('快捷方式指向的路径无效'); 
    end;
      

  2.   

    汝就不会动动脑子嘛 s := ExeFromLink('d:\Internet Explorer.lnk');
    这个s就是快捷方式的“目标”中的全部字符串,
    而 IEXPLORE.EXE" HTTP://WWW.BAIDU.COM/ 中间有个 " 分隔,前段是exe,后面是参数
    你分割处理下这个 S 字符串不就得了
      

  3.   

    看了下
    link.GetArguments 这个函数就是返回快捷方式的参数,也就是那个网址
      

  4.   


    type
      ShellLinkData = record
        path: array[1..MAX_PATH] of Char; // 路径
        arguments: array[1..MAX_PATH] of char; // 参数
        // 更多自己加
      end;uses shlobj, ActiveX, ComObj, ShellAPI;procedure ExeFromLink(const linkName: WideString; var sld: ShellLinkData);
    var
      link: IShellLink;
      storage: IPersistFile;
      fileData: TWin32FindData;
      widePath: WideString;
    begin
      OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER,
        IShellLink, link));
      OleCheck(link.QueryInterface(IPersistFile, storage));
      widePath := linkName;  if Succeeded(storage.Load(@widepath[1], STGM_READ)) then
        if Succeeded(link.Resolve(GetActiveWindow, SLR_NOUPDATE)) then
        begin
          link.GetPath(@sld.path, MAX_PATH, fileData, SLGP_UNCPRIORITY);
          link.GetArguments(@sld.arguments, MAX_PATH);
        end;  storage := nil;
      link := nil;
    end;procedure TForm1.btn1Click(Sender: TObject);
    var
      linkData: ShellLinkData;
    begin
      ExeFromLink('d:\Internet Explorer.lnk', linkData);
      ShellExecute(Handle, 'open', @linkData.path, @linkData.arguments, '',
        SW_SHOWNORMAL);
    end;