来源:http://www.itboyzone.com/?post=75
本文借鉴:http://bbs.51cto.com/thread-493507-1.html
http://hi.baidu.com/invisiable/item/dfe18c818cc4cadcd1f8cdcc
程序是我理解后写的,可以运行,有些数据需要根据具体情况自己改一下,相信大家看后都知道怎么创建一个快捷方式和获得快捷方式的相关信息。
Windows的快捷方式实际上是一个带有扩展名LNK的数据文件,其中包含有用于访问Windows某一对象(即在资源管理器中所能浏览的所有对象,包括文件,文件夹,驱动器及打印机等)的有关信息,如目标对象的路径和名称,工作目录,要传递的命令行参数,运行时的初始显示状态,图标及其快捷键等。通过在快捷方式上单击鼠标右键并在弹出菜单中选择“属性”可以观察该快捷方式的这些性质。
快捷方式的数据文件如果存放在C:\Windows\Desktop子目录下,这个快捷方式就会显示在桌面上,而如果存放在C:\Windows\”Start Menu”\Programs子目录下,这个快捷方式就会作为“开始”菜单的一个菜单项出现。而桌面上的文件夹和“开始”菜单的菜单组则是上述两个子目录下的子目录的表现。
Windows外壳(Shell)的快捷方式是以OLE技术的组件对象模型COM(Component ObjectModal)为基础而设计的。利用COM模型,一个应用程序可以调用另一应用程序的某些功能。这方面的技术细节请参阅有关文献。
创建Windows的快捷方式比较容易。首先利用OLE通过调用CoCreateInstance()函数建立一个IID_IShellLink实例,并同时得到其接口指针。利用这个接口指针可以对其各项属性进行设置。为了使这些信息以快捷方式的数据文件(*.lnk)格式保存起来,还需要从IID_IShellLink对象取得其IID_IPersistFile接口指针,以便于调用其成员函数Save()保存前面设置的信息。
至于如何删除快捷方式以及创建和删除文件夹,则只需要简单地调用文件操作函数SHFileOperation()就可以了。另外应该注意,在完成上述操作之后,都要调用SHChangeNotify()函数通知Windows外壳有关变化以使之及时更新其显示状态。
需要的头文件:shlobj.h
IShellLink主要成员:
1、GetArguments:获得参数信息
2、GetDescription:获得描述信息(备注行)
3、GetHotkey:获得快捷键
4、GetIconLocation:获得图标
5、GetIDList:获得快捷方式的目标对象的item identifier list (Windows外壳中的每个对象如文件,目录和打印机等都有唯一的item identifiler list)
6、GetPath: 获得快捷方式的目标文件或目录的全路径
7、GetShowCmd:获得快捷方式的运行方式,比如常规窗口,最大化
8、GetWorkingDirectory:获得工作目录
9、Resolve:按照一定的搜索规则试图获得目标对象,即使目标对象已经被删除或移动,重命名下面是对应信息的设置方法
10、SetArguments
11、SetDescription
12、SetHotkey
13、SetIconLocation
14、SetIDList
15、SetPath
16、SetRelativePat
17、SetShowCmd
18、SetWorkingDirectory
IPersistFile主要成员:
1、IsDirty:Checks an object for changes since it was last saved to its current file.
2、Load:Opens the specified file and initializes an object from the file contents.
3、Save:Saves the object into the specified file.
4、SaveCompleted:Notifies the object that it can revert from NoScribble mode to Normal mode.
5、GetCurFile:Gets the current name of the file associated with the object.
详细的用法还是参考MSDN,这些不是本文的重点。。常用的是Load和Save
HRESULT Load( LPCOLSTR pszFileName, //快捷方式的文件名,应该是ANSI字符
DWORD dwMode //读取方式);
dwMode可取如下值:
STGM_READ:只读
STGM_WRITE:只写
STGM_READWRITE:读写
返回值:
S_OK :成功
E_OUTOFMEMORY :失败,原因是因为内存不足
E_FAIL :失败,原因是除内存不足的其它的原因
程序一般的步骤:
一、初始化COM接口
二、创建IShellLink对象
三、从IShellLink对象中获取IPersistFile对象接口
四、操作IShellLink对象
五、释放IPersistFile对象接口
六、释放IShellLink对象
七、释放COM接口
示例代码:
#include "iostream.h"
#include "stdafx.h"
#include "shlobj.h"
int main()
{
char *path="D:\\Program Files\\Tencent\\QQ\\Bin\\QQ.exe";//目标的路径
char *work="D:\\Program Files\\Tencent\\QQ\\Bin";//起始位置
char *dir="C:\\Documents and Settings\\Administrator\\桌面\\QQ.lnk"; //快捷方式的路径
HRESULT hres;
IShellLink *psl;
IPersistFile *ppf;
WIN32_FIND_DATA fd;
//初始化COM库
hres = CoInitialize(NULL);
if(!SUCCEEDED(hres))
return false;
hres = CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&psl); //建立一个IID_IShellLink实例
if(!SUCCEEDED(hres))
return false;
psl->SetPath(path);//设置目标的路径
psl->SetWorkingDirectory(work); //设置目标的起始位置
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);
//确保快捷方式路径由ANSI字符串组成
if (SUCCEEDED(hres))
{
WCHAR wsz[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, dir, -1, wsz, MAX_PATH);
hres = ppf->Save(wsz, TRUE);
ppf->Release();
}
psl->Release();
hres = CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&psl); //建立一个IID_IShellLink实例
if(!SUCCEEDED(hres))
return false;
char filepath[MAX_PATH];
hres = psl->GetPath(filepath,MAX_PATH,&fd,0);
cout<<path<<endl;
psl->Release();
CoUninitialize(); //释放com接口
return hres;
}
SUCCEEDED(hres);是用来判断com接口方法的返回值hres是否正确运行,当hres小于0时表示接口方法遇到错误,于是SUCCEEDED的结果就是FALSE,否则就是TRUE。