声明:本文是参考网友博文,然后自己实践整理所得,转载请注明出处!

  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 != )
pLink->SetHotkey(wHotkey); if (lpszDescription != NULL)
pLink->SetDescription(lpszDescription); pLink->SetShowCmd(iShowCmd); char szBuffer[MAX_PATH] = {};
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 - ] = 'l';
szBuffer[nLen - ] = 'n';
szBuffer[nLen - ] = 'k';
} WCHAR wsz[MAX_PATH] = {};
MultiByteToWideChar(CP_ACP, , szBuffer, -, 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 + ] = {};
MultiByteToWideChar(CP_ACP, , lpszLinkPath, -, wszLinkPath, MAX_PATH + );
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:\\",
,
"审计浏览器",
);
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 ;
}

VC++ 操作Windows快捷方式的更多相关文章

  1. vc操作windows防火墙的方法

    收藏该地址,以备不时之需. http://msdn.microsoft.com/en-us/library/aa364726.aspx

  2. C语言操作WINDOWS系统存储区数字证书相关函数详解及实例

     C语言操作WINDOWS系统存储区数字证书相关函数详解及实例 以下代码使用C++实现遍历存储区证书及使用UI选择一个证书 --使用CertOpenSystemStore打开证书存储区. --在循环中 ...

  3. 全键盘操作Windows

    计算机机用户在使用计算机的时候,是用键盘多一点?还是用鼠标多一点?如果是专业打字员,应该会说他使用键盘多一点,除此之外,多数人都会告诉你,他已经离不开鼠标了,没有鼠标,就不会操作电脑.   如果某一天 ...

  4. VC+++ 操作word

    最近完成了一个使用VC++ 操作word生成扫描报告的功能,在这里将过程记录下来,开发环境为visual studio 2008 导入接口 首先在创建的MFC项目中引入word相关组件 右键点击 项目 ...

  5. winreg操作windows注册表详解示例

    #coding:utf-8 #=====================================================================#=====本程序演示了WINR ...

  6. VC操作excel

    http://www.cnblogs.com/witxjp/archive/2010/06/05/1752181.html   最近在做个数据库程序,因为有些数据用户要求导出到Excel文件显示(需要 ...

  7. C# 操作windows服务[启动、停止、卸载、安装]

    主要宗旨:不已命令形式操作windows服务 static void Main(string[] args) { var path = @"E:\开发辅助项目\WCF\WCF.Test\WC ...

  8. VC++实现解析快捷方式

    VC++实现解析快捷方式: http://blog.csdn.net/mydreamremindme/article/details/9826745 

  9. C#通过SC命令和静态公共类来操作Windows服务

    调用的Windows服务应用程序网址:http://www.cnblogs.com/pingming/p/5115304.html 一.引用 二.公共静态类:可以单独放到类库里 using Syste ...

随机推荐

  1. Django:Django Rest Framework

    Django Rest Framework   一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称 ...

  2. ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)

    原帖地址:http://www.cnblogs.com/QLeelulu/archive/2008/10/09/1307660.html 有时候你想在调用action方法之前或者action方法之后处 ...

  3. mongodb学习笔记之索引(转)

    一.索引基础:    MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令:    > db.test.ensureIndex({" ...

  4. cocos2d-x--精灵反转效果--CCOrbitCamera

    CCSprite* pSprite = CCSprite::spriteWithFile("grossini.png"); pSprite->setPosition(ccp( ...

  5. C++ 11 nullptr关键字

    熟悉C++的童鞋都知道,为了避免“野指针”(即指针在首次使用之前没有进行初始化)的出现,我们声明一个指针后最好马上对其进行初始化操作.如果暂时不明确该指针指向哪个变量,则需要赋予NULL值.除了NUL ...

  6. IR的评价指标之MRR

    MRR(Mean Reciprocal Rank): 是一个国际上通用的对搜索算法进行评价的机制,即第一个结果匹配,分数为1,第二个匹配分数为0.5,第n个匹配分数为1/n,如果没有匹配的句子分数为0 ...

  7. js photoswipe 相册使用 移动pc端均可

    http://photoswipe.com/ 官网  这里使用的是最新 4.1.1版本 http://photoswipe.com/documentation/getting-started.html ...

  8. sqlserver 多排序的问题

    sql 执行默认执行排序的第一个字段,如果结果集中含有重复的列的字段,才会按照2...N个字段进行排序,没有重复列多排序无效果

  9. dp之区间:最大k乘积

    题目:给你一个n(1<=n<=15)位数,求将它分成m段,用m-1个*连接起来的最大乘积....... 思路:定义dp[i][j]为将前i位数分成j段的最大乘积,那么dp[i][j]==m ...

  10. tomcat事件处理机制

    最近在阅读“how tomcat works”这本书,结合tomcat7的源码进行学习.对于学习的收获,将通过“tomcat学习系列”记录下来,和大家一起分享和交流,也算对自己学习的一种促进.闲话不多 ...