如何读取快捷方式的路径和名称(路径和名称都是未知的)?
例如:
A.exe有个快捷方式在桌面上A.lnk
现在有人将这个A.lnk剪切到某个目录下,并且改名了程序中如何得知A.exe的快捷方式的路径呢(不要采用遍历硬盘中文件,因为这样和搜索文件一样,速度太慢了)?麻烦高手指点,谢谢(不知google企业套件是怎么做到的)

解决方案 »

  1.   

    估计是有个数据库吧,像Thumbs.db这类的有个记录,等待正确答案
      

  2.   

    function   LinkFileInfo(const   lnkFileName:string;var   info:LINK_FILE_INFO;const   bSet:boolean):boolean;   
      var   
      hr:hresult;   
      psl:IShelllink;   
      wfd:win32_find_data;   
      ppf:IPersistFile;   
      lpw:pwidechar;   
      buf:pwidechar;   
      begin   
      result:=false;   
      getmem(buf,MAX_PATH);   
      try   
      if   SUCCEEDED(CoInitialize(nil))   then   
      if   (succeeded(cocreateinstance(clsid_shelllink,nil,clsctx_inproc_server,IID_IShellLinkA,psl)))   then   
      begin   
      hr:=psl.QueryInterface(iPersistFile,ppf);   
      if   succeeded(hr)   then   
      begin   
      lpw:=stringtowidechar(lnkfilename,buf,MAX_PATH);   
      hr   :=   ppf.Load(lpw,   STGM_READ);   
      if   succeeded(hr)   then   
      begin   
      hr   :=   psl.Resolve(0,   SLR_NO_UI);   
      if   succeeded(hr)   then   
      begin   
      if   bSet   then   
      begin   
      psl.SetArguments(info.Arguments);   
      psl.SetDescription(info.Description);   
      psl.SetHotkey(info.HotKey);   
      psl.SetIconLocation(info.IconLocation,info.IconIndex);   
      psl.SetIDList(info.ItemIDList);   
      psl.SetPath(info.FileName);   
      psl.SetShowCmd(info.ShowState);   
      psl.SetRelativePath(info.RelativePath,0);   
      psl.SetWorkingDirectory(info.WorkDirectory);   
      if   succeeded(psl.Resolve(0,SLR_UPDATE))   then   
      result:=true;   
      end   
      else   
      begin   
      psl.GetPath(info.FileName,MAX_PATH,   wfd,SLGP_SHORTPATH   );   
      psl.GetIconLocation(info.IconLocation,MAX_PATH,info.IconIndex);   
      psl.GetWorkingDirectory(info.WorkDirectory,MAX_PATH);   
      psl.GetDescription(info.Description,CCH_MAXNAME);   
      psl.GetArguments(info.Arguments,MAX_PATH);   
      psl.GetHotkey(info.HotKey);   
      psl.GetIDList(info.ItemIDList);   
      psl.GetShowCmd(info.ShowState);   
      result:=true;   
      end;   
      end;   
      end;   
      end;   
      end;   
      finally   
      freemem(buf);   
      end;   
      end;   
      

  3.   

    gyk120 回复的 也不行
    因为 link文件名和路径都是未知的其实我要做的就是一个类似google企业套件(如GMail)
    你直接点击exe是打不开的,只能通过点击快捷方式打开
    并且更改快捷方式-属性-目标("C:\Program Files\Google\Google Apps\googleapps.exe" --mail.google.com)中 --mail.google.com 改为 --calendar.google.com 然后保存
    再点击快捷方式时,启动的就是calendar.google.com, 如果改为--www.baidu.com,是打不开网站的,
    它只能打开指定的网站
    而且将快捷方式剪切到任何目录下,都是可以打开的(只能打开指定的网站,在程序中控制的)
      

  4.   

    如果 快捷方式的路径 和 名称是已知的,就很好实现,如下代码, 如果是未知的如何处理呢(采用遍历硬盘文件,就是读取硬盘中每个link文件 的 目标 与exe的路径名称比较,如果一致,则可知道该link文件是该exe的快捷方式,但是这种方式速度超慢,不可取)?希望高手能指点下,感激不尽begin
      Application.Initialize;
      Window1 := FindWindow(nil, 'XXX系统');
      if Window1 = 0 then
      begin
        Application.Title := 'XXX系统';
        Lv_FileName := Pvt_GetDeskTopPath + '\XXX系统.lnk';  // 取得桌面已知快捷方式文件名    if FileExists(Lv_FileName) then
        begin
          Pvt_LinkFileInfo(Lv_FileName, Lv_Info, False); // 读取已知LinkFileName文件信息
           Lv_Pos := Pos('--', Lv_Info.Params);
          if Lv_Pos = 0 then
          begin
          //  Pv_URL := Cv_DEFAULTWEBSITE;  // 打开默认网站
            Application.Terminate;  // 不是程序中指定的网站,就无法打开
            Exit;
          end
          else
          begin
            Lv_Home := Copy(Lv_Info.Params, Lv_Pos + 2, Length(Lv_Info.Params) - Lv_Pos - 1);  // 取得快捷方式-属性-目标中设置的网站
            if Lv_Home = '' then
            begin
            //  Pv_URL := Cv_DEFAULTWEBSITE;
              Application.Terminate; // 不是程序中指定的网站,就无法打开
              Exit;
            end
            else
            begin
              if Pos(UpperCase(Lv_Home), UpperCase(Cv_AuthenticWebSite)) <> 0 then
                Pv_URL := Lv_Home
              else
              begin
               // Pv_URL := Cv_DEFAULTWEBSITE;
               Application.Terminate; // 不是程序中指定的网站,就无法打开
               Exit;
              end;
            end;
          end;
        end
        else
        begin
          // Pv_URL := Cv_DEFAULTWEBSITE;
            Application.Terminate; // 不是程序中指定的网站,就无法打开
            Exit;
        end;    Application.Hint := Pv_URL;
      Application.CreateForm(TfrmMain, frmMain);
      Application.Run;
      end
      else
      begin
        MessageDlg('该程序已经打开!', mtInformation, [mbOK], 0);
        Application.Terminate;
      end;
    end.
      

  5.   

    其实系统怎么使用快捷方式来运行程序lz不用考虑,那是系统作的工作。lz只需要考虑程序中检查启动参数是否为指定参数:若无启动参数则拒绝继续运行,若是则继续运行即可。
      

  6.   

    无法根据实际的exe,得到他的快捷方式的位置,反之可以,快捷方式可以任意放置不同的位置,两者的联系是快捷方式对exe的关联,而不是exe对快捷方式的关联
      

  7.   


    我有点糊涂了,快捷方式里只要保存的目标路径和参数不变,随便往硬盘上哪里丢都一样能点击打开对应程序。google的企业套件之所以你输入百度的网址打不开是因为一个地址都是对应它的一个应用,你输入了错的地址可能在它的检验机制里就过不了,当然打不开网站。再回头看你提的问题,如果快捷方式被改名,移动,你又没有保存快捷方式中的任何信息,比如目标地址,那你当然只有搜索整个硬盘去匹配了。只能在搜索算法上改进的。