如何读取快捷方式的路径和名称(路径和名称都是未知的)?
例如:
A.exe有个快捷方式在桌面上A.lnk
现在有人将这个A.lnk剪切到某个目录下,并且改名了程序中如何得知A.exe的快捷方式的路径呢(不要采用遍历硬盘中文件,因为这样和搜索文件一样,速度太慢了)?麻烦高手指点,谢谢(不知google企业套件是怎么做到的)
例如:
A.exe有个快捷方式在桌面上A.lnk
现在有人将这个A.lnk剪切到某个目录下,并且改名了程序中如何得知A.exe的快捷方式的路径呢(不要采用遍历硬盘中文件,因为这样和搜索文件一样,速度太慢了)?麻烦高手指点,谢谢(不知google企业套件是怎么做到的)
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;
因为 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,是打不开网站的,
它只能打开指定的网站
而且将快捷方式剪切到任何目录下,都是可以打开的(只能打开指定的网站,在程序中控制的)
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.
我有点糊涂了,快捷方式里只要保存的目标路径和参数不变,随便往硬盘上哪里丢都一样能点击打开对应程序。google的企业套件之所以你输入百度的网址打不开是因为一个地址都是对应它的一个应用,你输入了错的地址可能在它的检验机制里就过不了,当然打不开网站。再回头看你提的问题,如果快捷方式被改名,移动,你又没有保存快捷方式中的任何信息,比如目标地址,那你当然只有搜索整个硬盘去匹配了。只能在搜索算法上改进的。