C++如何取到桌面其中一个快捷方式图标里的起始位置

koolxiaoyuer 2010-12-31 10:32:23
比如说安装了个360杀毒软件,并在桌面上创建了360杀毒软件的快捷方式。它的属性里有个“起始位置”,如"C:\Program Files\360\360sd"。 我要写一个C++程序,只知道360杀毒软件快捷图标的名称,要取到“起始位置”的字符串"C:\Program Files\360\360sd"。 如何写?桌面路径取当前用户的桌面路径。也就是说:如果一台机子上开了好几个用户账号,那就取登陆的那个的桌面地址。假设每一个用户都安装了360杀毒,并生成桌面图标.
...全文
668 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
云朵0101 2013-08-21
  • 打赏
  • 举报
回复
楼主,你是怎么获取 .lnk文件的????
我想点击图标,获取link文件所在的位置,也就是想获取link片
koolxiaoyuer 2011-01-05
  • 打赏
  • 举报
回复
结贴,谢谢lucifer和ddlddy
龙哥依旧 2011-01-02
  • 打赏
  • 举报
回复
cshelllink.Load(_T("C:\\Documents and Settings\\liu\\桌面\\360杀毒.lnk"))
goas 2011-01-02
  • 打赏
  • 举报
回复
直接读注册表不就行了吗!?

说不定CShellLink类也是通注册表来完成了....
koolxiaoyuer 2010-12-31
  • 打赏
  • 举报
回复
是哪几个??参数的意思?举个例子调用此函数呗
:)
koolxiaoyuer 2010-12-31
  • 打赏
  • 举报
回复
void QdSetup::GetLinkPath(wchar_t *lpszLink, wchar_t *szPath, wchar_t *szParam)
里面的参数没看明白是几个啊?解释下,不然不会怎么传啊。怎么能结贴呢?
:)
龙哥依旧 2010-12-31
  • 打赏
  • 举报
回复
直接用那个函数就OK了,想具体研究,对照着看看吧
先结贴好吧!
:)
koolxiaoyuer 2010-12-31
  • 打赏
  • 举报
回复
其实我知道如果绑定以后,使用实例的GetWorkingDirectory(lpStr,MAX_PATH);就可以取到快捷方式的起始位置了,但就是卡在“绑定实例上了”“绑定到具体快捷方式”
龙哥依旧 2010-12-31
  • 打赏
  • 举报
回复
IShellLink
其实查MSDN就应该可以搞定的,调用组件接口基本都一个套路,具体的地方查查,不过呢,现在是自己能做的事情自己做的人越来越少啦,除非是没有现成的!
koolxiaoyuer 2010-12-31
  • 打赏
  • 举报
回复
我试了下用SetPath函数,如:
pishell->SetPath(_T("C:\Documents and Settings\liu\桌面\360杀毒"));
或者
pishell->SetPath(_T("C:\Documents and Settings\liu\桌面\360杀毒.lnk"));
都会报错。PS:“C:\Documents and Settings\liu\桌面\” 是当前桌面路径
龙哥依旧 2010-12-31
  • 打赏
  • 举报
回复
void QdSetup::GetLinkPath(wchar_t *lpszLink, wchar_t *szPath, wchar_t *szParam)   
{
HRESULT hres;
IShellLink* psl;
wchar_t szGotPath[MAX_PATH];
wchar_t szArguement[MAX_PATH];
WIN32_FIND_DATA wfd;

*szPath = 0; // assume failure
CoInitialize(0);
// Get a pointer to the IShellLink interface.
hres = CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *) &psl);
if (SUCCEEDED(hres)) {
IPersistFile* ppf;

// Get a pointer to the IPersistFile interface.
hres = psl->QueryInterface(IID_IPersistFile,
(void**)&ppf);
if (SUCCEEDED(hres)) {
//WCHAR wsz[MAX_PATH];

//// Ensure that the string is Unicode.
//MultiByteToWideChar(CP_ACP, 0, lpszLink, -1, wsz,
// MAX_PATH);

// Load the shortcut.
hres = ppf->Load(lpszLink, STGM_READ);
if (SUCCEEDED(hres)) {

// Resolve the link.
hres = psl->Resolve(0, 0);
if (SUCCEEDED(hres)) {

// Get the path to the link target.
hres = psl->GetPath(szGotPath,
MAX_PATH, (WIN32_FIND_DATA *)&wfd,
SLGP_SHORTPATH );
if (SUCCEEDED(hres))
lstrcpy(szPath, szGotPath);
hres = psl->GetArguments(szArguement, 256);
if(SUCCEEDED(hres))
lstrcpy(szParam, szArguement);
}
}
// Release the pointer to the IPersistFile interface.
ppf->Release();
}
// Release the pointer to the IShellLink interface.
psl->Release();
}
if(hres)
lstrcpy(szPath, lpszLink);
CoUninitialize();
}
koolxiaoyuer 2010-12-31
  • 打赏
  • 举报
回复
谢谢一楼,让我知道使用:
			LPITEMIDLIST pidl;
HRESULT hr= SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidl);
TCHAR szPath[MAX_PATH];
SHGetPathFromIDList(pidl, szPath);
CString strQPath =szPath; //桌面路径

得到桌面路径,使用IShellLink是快捷方式。
我现在遇到的问题是如何绑定IShellLink?这么说吧:我声明一个IShellLink对象ishell,或者指针pishell,但如何取指定它是桌面上的具体图标。比如我桌面上有一个名为“360杀毒”的图标。怎么让ishell是这个图标的实例?
龙哥依旧 2010-12-31
  • 打赏
  • 举报
回复
通过系统操作快捷方式的接口
luciferisnotsatan 2010-12-31
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20091013/23/1d02fff3-cd9a-42ca-a71b-91f48cb61216.html
koolxiaoyuer 2010-12-31
  • 打赏
  • 举报
回复
lucifer
不行啊,还是不给力啊。

CoInitialize(0);
CShellLink cshelllink;
if(cshelllink.Load(_T("C:\Documents and Settings\liu\桌面\360杀毒.lnk")))
{
CString strtemp = cshelllink.GetPath();
}

路径没错,但Load函数总是返回FALSE,调试进去 HRESULT hRes = m_ppf->Load(wszPath, STGM_READ);总是返回“系统找不到文件”
koolxiaoyuer 2010-12-31
  • 打赏
  • 举报
回复
多谢lucifer,我先研究一下。10分钟
luciferisnotsatan 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 koolxiaoyuer 的回复:]

你能把这个函数的参数都改成CString类型吗?
void GetLinkPath(CString& lpszLink, CString& szPath, CString& szParam);

另外疑问:第一个参数传进去快捷方式路径?只是路径?我桌面上快捷方式很多,如迅雷,这个函数怎么知道我要取的是360还是迅雷?所以这里应该是带上名称的吧?是:_T("C:\Do……
[/Quote]

要完整路径 _T("C:\Documents and Settings\liu\桌面\360杀毒.lnk")
龙哥依旧 2010-12-31
  • 打赏
  • 举报
回复
_T("C:\Documents and Settings\liu\桌面\360杀毒.lnk")
你小子,自己改成CString的吧,也不难,第一个不是引用!
你这不光是吃现成的啊,还得人咀嚼完了,直接灌到你嘴里,然后你再咽下去!^_^
koolxiaoyuer 2010-12-31
  • 打赏
  • 举报
回复
你能把这个函数的参数都改成CString类型吗?
void GetLinkPath(CString& lpszLink, CString& szPath, CString& szParam);

另外疑问:第一个参数传进去快捷方式路径?只是路径?我桌面上快捷方式很多,如迅雷,这个函数怎么知道我要取的是360还是迅雷?所以这里应该是带上名称的吧?是:_T("C:\Documents and Settings\liu\桌面\360杀毒")还是_T("C:\Documents and Settings\liu\桌面\360杀毒.lnk")呢?如果都不是,那应该是则样的?
luciferisnotsatan 2010-12-31
  • 打赏
  • 举报
回复
这里有个封装好的类
http://www.cnblogs.com/phinecos/archive/2008/07/06/1236968.html

我这编译时,好像没有IUniformResourceLocator这个东西,把CUrlShellLink注释了就是了。

使用
CoInitialize(0);
CShellLink obj;
obj.Load(_T("C:/Documents and Settings/bizuser/桌面/金山词霸2007.lnk"));
CString str = obj.GetPath();
AfxMessageBox(str);
CoUninitialize();
加载更多回复(1)

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧