声明:本文是参考网友博文,然后自己实践整理所得,转载请注明出处!
Windows的快捷方式实际上是一个带有扩展名LNK的数据文件,其中包含有用于访问Windows某一对象(即在资源管理器中所能浏览的所有对象,包括文件,文件夹,驱动器及打印机等)的有关信息,如目标对象的路径和名称,工作目录,要传递的命令行参数,运行时的初始显示状态,图标及其快捷键等。通过在快捷方式上单击鼠标右键并在弹出菜单中选择“属性”可以观察该快捷方式的这些性质。
桌面快捷方式
快捷方式的数据文件如果存放在C:\Windows\Desktop子目录下,这个快捷方式就会显示在桌面上。
“开始菜单”快捷方式
如果存放在C:\Windows\Start Menu\Programs子目录下,这个快捷方式就会作为“开始”菜单的一个菜单项出现。
而桌面上的文件夹和“开始”菜单的菜单组则是上述两个子目录下的子目录的表现。
Windows外壳(Shell)的快捷方式是以OLE技术的组件对象模型COM为基础而设计的。利用COM模型,一个应用程序可以调用另一应用程序的某些功能。
如何创建Windows的快捷方式?
首先利用OLE通过调用CoCreateInstance()函数建立一个IID_IShellLink实例,并同时得到其接口指针。利用这个接口指针可以对其各项属性进行设置。为了使这些信息以快捷方式的数据文件(*.lnk)格式保存起来,还需要从IID_IShellLink对象取得其IID_IPersistFile接口指针,以便于调用其成员函数Save()保存前面设置的信息。
至于如何删除快捷方式以及创建和删除文件夹,则只需要简单地调用文件操作函数SHFileOperation()就可以了。另外应该注意,在完成上述操作之后,都要调用SHChangeNotify()函数通知Windows外壳有关变化以使之及时更新其显示状态。
需要的头文件:shobjidl.h
IShellLink接口成员:
1、GetArguments:获取Shell link对象命令行参数信息
2、GetDescription:获取Shell link对象描述信息
3、GetHotkey:获得Shell link对象快捷键
4、GetIconLocation:获得Shell link对象图标
5、GetIDList:获得Shell link对象的唯一的item identifier list
6、GetPath: 获得Shell link对象的目标文件或目录的全路径
7、GetShowCmd:获得Shell link对象的运行方式,比如常规窗口,最大化
8、GetWorkingDirectory:获得Shell link对象的工作目录
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, //快捷方式的文件名
DWORD dwMode); //读取方式
dwMode可取如下值:
STGM_READ:只读
STGM_WRITE:只写
STGM_READWRITE:读写
返回值:
S_OK :成功
E_OUTOFMEMORY :失败,原因是因为内存不足
E_FAIL :失败,原因是除内存不足的其它的原因
#include <ShObjIdl.h>
#include <ShlGuid.h> #include <stdio.h> /* 函数功能:对指定文件在指定的目录下创建其快捷方式 函数参数: lpszFileName 指定文件,为NULL表示当前进程的EXE文件。 lpszLnkFileDir 指定目录,不能为NULL。 lpszLnkFileName 快捷方式名称,为NULL表示EXE文件名。 wHotkey 为0表示不设置快捷键 pszDescription 备注 iShowCmd 运行方式,默认为常规窗口 */ BOOL CreateFileShortcut(LPCSTR lpszFileName, LPCSTR lpszLnkFileDir, LPCSTR lpszLnkFileName, LPCSTR lpszWorkDir, WORD wHotkey, LPCTSTR lpszDescription, int iShowCmd) { if (lpszLnkFileDir == NULL) return FALSE; HRESULT hr; IShellLink *pLink; IPersistFile *ppf; hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pLink); if (FAILED(hr)) return FALSE; hr = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf); if (FAILED(hr)) { pLink->Release(); return FALSE; } if (lpszFileName == NULL) pLink->SetPath(_pgmptr); else pLink->SetPath(lpszFileName); if (lpszWorkDir != NULL) pLink->SetWorkingDirectory(lpszWorkDir); if (wHotkey != 0) pLink->SetHotkey(wHotkey); if (lpszDescription != NULL) pLink->SetDescription(lpszDescription); pLink->SetShowCmd(iShowCmd); char szBuffer[MAX_PATH] = {0}; if (lpszLnkFileName != NULL) sprintf(szBuffer, "%s\\%s", lpszLnkFileDir, lpszLnkFileName); else { const char *pstr; if (lpszFileName != NULL) pstr = strrchr(lpszFileName, '\\'); else pstr = strrchr(_pgmptr, '\\'); if (pstr == NULL) { ppf->Release(); pLink->Release(); return FALSE; } sprintf(szBuffer, "%s\\%s", lpszLnkFileDir, pstr); int nLen = strlen(szBuffer); szBuffer[nLen - 3] = 'l'; szBuffer[nLen - 2] = 'n'; szBuffer[nLen - 1] = 'k'; } WCHAR wsz[MAX_PATH] = {0}; MultiByteToWideChar(CP_ACP, 0, szBuffer, -1, wsz, MAX_PATH); hr = ppf->Save(wsz, TRUE); if (SUCCEEDED(hr)) { // ... } ppf->Release(); pLink->Release(); return SUCCEEDED(hr); } /* 函数功能:获取指定快捷方式的目标文件(修改后可重新设置) 函数参数: lpszLinkPath 指定快捷方式全路径名。 lpszTargetPath 获取快捷方式目标文件缓冲区。 dwTargetPathLen 快捷方式目标文件缓冲区大小。 */ BOOL GetLinkTarget(LPCSTR lpszLinkPath,
LPSTR lpszTargetPath,
DWORD dwTargetPathLen) { BOOL bRet = FALSE; HRESULT hr = 0; IShellLink *pLink = NULL; IPersistFile *ppf = NULL; hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pLink); if (FAILED(hr)) return FALSE; hr = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf); if (FAILED(hr)) { pLink->Release(); return FALSE; } WCHAR wszLinkPath[MAX_PATH + 1] = {0}; MultiByteToWideChar(CP_ACP, 0, lpszLinkPath, -1, wszLinkPath, MAX_PATH + 1); hr = ppf->Load(wszLinkPath, STGM_READWRITE); if (SUCCEEDED(hr)) { hr = pLink->Resolve(NULL, SLR_NO_UI); if (SUCCEEDED(hr)) { hr = pLink->GetPath(lpszTargetPath, dwTargetPathLen, NULL, SLGP_RAWPATH); if (SUCCEEDED(hr)) { hr = pLink->SetPath(lpszTargetPath); if (SUCCEEDED(hr)) {
hr = ppf->Save(lpszLinkPath, TRUE);
if (SUCCEEDED(hr))
{
bRet = TRUE;
}
} } } } ppf->Release(); pLink->Release(); return bRet; } int main() { CoInitialize(NULL); CreateFileShortcut("D:\\Kingview7.5 SP1\\KV7.5_CN_work\\Unicode\\build\\bind\\SignatureAudit.exe", "D:\\", "SignatureAudit.lnk", "D:\\", 0, "审计浏览器", 0);
char szBuf[MAX_PATH] = ""; LPSTR lpszTargetPath = szBuf; GetLinkTarget("C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Kingview\\Help\\Kingview help.lnk", lpszTargetPath, MAX_PATH); CoUninitialize(); return 0; }