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

  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>

  1. #include <ShlGuid.h>
  2. #include <stdio.h>
  3.  
  4. /* 函数功能:对指定文件在指定的目录下创建其快捷方式
  5. 函数参数:
  6. lpszFileName 指定文件,为NULL表示当前进程的EXE文件。
  7. lpszLnkFileDir 指定目录,不能为NULL。
  8. lpszLnkFileName 快捷方式名称,为NULL表示EXE文件名。
  9. wHotkey 为0表示不设置快捷键
  10. pszDescription 备注
  11. iShowCmd 运行方式,默认为常规窗口
  12. */
  13.  
  14. BOOL CreateFileShortcut(LPCSTR lpszFileName,
  15. LPCSTR lpszLnkFileDir,
  16. LPCSTR lpszLnkFileName,
  17. LPCSTR lpszWorkDir,
  18. WORD wHotkey,
  19. LPCTSTR lpszDescription,
  20. int iShowCmd)
  21. {
  22. if (lpszLnkFileDir == NULL)
  23. return FALSE;
  24.  
  25. HRESULT hr;
  26. IShellLink *pLink;
  27. IPersistFile *ppf;
  28.  
  29. hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pLink);
  30. if (FAILED(hr))
  31. return FALSE;
  32.  
  33. hr = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf);
  34. if (FAILED(hr))
  35. {
  36. pLink->Release();
  37. return FALSE;
  38. }
  39.  
  40. if (lpszFileName == NULL)
  41. pLink->SetPath(_pgmptr);
  42. else
  43. pLink->SetPath(lpszFileName);
  44.  
  45. if (lpszWorkDir != NULL)
  46. pLink->SetWorkingDirectory(lpszWorkDir);
  47.  
  48. if (wHotkey != )
  49. pLink->SetHotkey(wHotkey);
  50.  
  51. if (lpszDescription != NULL)
  52. pLink->SetDescription(lpszDescription);
  53.  
  54. pLink->SetShowCmd(iShowCmd);
  55.  
  56. char szBuffer[MAX_PATH] = {};
  57. if (lpszLnkFileName != NULL)
  58. sprintf(szBuffer, "%s\\%s", lpszLnkFileDir, lpszLnkFileName);
  59. else
  60. {
  61. const char *pstr;
  62. if (lpszFileName != NULL)
  63. pstr = strrchr(lpszFileName, '\\');
  64. else
  65. pstr = strrchr(_pgmptr, '\\');
  66.  
  67. if (pstr == NULL)
  68. {
  69. ppf->Release();
  70. pLink->Release();
  71. return FALSE;
  72. }
  73. sprintf(szBuffer, "%s\\%s", lpszLnkFileDir, pstr);
  74. int nLen = strlen(szBuffer);
  75. szBuffer[nLen - ] = 'l';
  76. szBuffer[nLen - ] = 'n';
  77. szBuffer[nLen - ] = 'k';
  78. }
  79.  
  80. WCHAR wsz[MAX_PATH] = {};
  81. MultiByteToWideChar(CP_ACP, , szBuffer, -, wsz, MAX_PATH);
  82. hr = ppf->Save(wsz, TRUE);
  83. if (SUCCEEDED(hr))
  84. {
  85. // ...
  86. }
  87.  
  88. ppf->Release();
  89. pLink->Release();
  90. return SUCCEEDED(hr);
  91. }
  92.  
  93. /* 函数功能:获取指定快捷方式的目标文件(修改后可重新设置)
  94. 函数参数:
  95. lpszLinkPath 指定快捷方式全路径名。
  96. lpszTargetPath 获取快捷方式目标文件缓冲区。
  97. dwTargetPathLen 快捷方式目标文件缓冲区大小。
  98. */
  99.  
  100. BOOL GetLinkTarget(LPCSTR lpszLinkPath,
               LPSTR lpszTargetPath,
               DWORD dwTargetPathLen)
  101. {
  102. BOOL bRet = FALSE;
  103. HRESULT hr = 0;
  104. IShellLink *pLink = NULL;
  105. IPersistFile *ppf = NULL;
  106.  
  107. hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pLink);
  108. if (FAILED(hr))
  109. return FALSE;
  110.  
  111. hr = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf);
  112. if (FAILED(hr))
  113. {
  114. pLink->Release();
  115. return FALSE;
  116. }
  117.  
  118. WCHAR wszLinkPath[MAX_PATH + ] = {};
  119. MultiByteToWideChar(CP_ACP, , lpszLinkPath, -, wszLinkPath, MAX_PATH + );
  120. hr = ppf->Load(wszLinkPath, STGM_READWRITE);
  121. if (SUCCEEDED(hr))
  122. {
  123. hr = pLink->Resolve(NULL, SLR_NO_UI);
  124. if (SUCCEEDED(hr))
  125. {
  126. hr = pLink->GetPath(lpszTargetPath, dwTargetPathLen, NULL, SLGP_RAWPATH);
  127. if (SUCCEEDED(hr))
  128. {
  129. hr = pLink->SetPath(lpszTargetPath);
  130. if (SUCCEEDED(hr))
  131. {
                hr = ppf->Save(lpszLinkPath, TRUE);
               if (SUCCEEDED(hr))
                {                
                  bRet = TRUE;

             }

  1. }
  2. }
  3. }
  4. }
  5.  
  6. ppf->Release();
  7. pLink->Release();
  8. return bRet;
  9. }
  10.  
  11. int main()
  12. {
  13. CoInitialize(NULL);
  14. CreateFileShortcut("D:\\Kingview7.5 SP1\\KV7.5_CN_work\\Unicode\\build\\bind\\SignatureAudit.exe",
  15. "D:\\",
  16. "SignatureAudit.lnk",
  17. "D:\\",
  18. ,
  19. "审计浏览器",
  20. );
  21. char szBuf[MAX_PATH] = "";
  22. LPSTR lpszTargetPath = szBuf;
  23. GetLinkTarget("C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Kingview\\Help\\Kingview help.lnk",
  24. lpszTargetPath,
  25. MAX_PATH);
  26. CoUninitialize();
  27. return ;
  28. }

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. 无线路由器硬件配置參数 NetGear篇

    NetGear     WNDR4500(号称地球上最强的无线路由器)    450Mbps+450Mbps          京东¥1399 0MHz.配备了128MB的内存和128MB的闪存,再以 ...

  2. 怎样设置linux中Tab键的宽度(可永久设置)

    和我的上篇文章一样,能够设置当前用户的Tab键宽度.也能够设置全部用户的Tab键宽度 一.仅设置当前用户的Tab键宽度 输入命令:vim ~/.vimrc 然后:set tabstop=4   //我 ...

  3. angular学习笔记(二十二)-$http.post

    基本语法: $http.post('url',{},{}).success(function(data,status,headers,config){ }).error(function(data,s ...

  4. Linux命令(24) :sort

    转载地址:点击 linux 命令详解 sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比 ...

  5. 李洪强iOS之集成极光推送一iOS SDK概述

    李洪强iOS之集成极光推送一iOS SDK概述 JPush iOS 从上图可以看出,JPush iOS Push 包括 2 个部分,APNs 推送(代理),与 JPush 应用内消息. 红色部分是 A ...

  6. DirectUI的初步分析-转

    DirectUI的初步分析(一) 最近由于项目的需要学习了一下DirectUI方面的东西,主要借鉴的是一个国外程序员写的代码(见引用一),看了后发现它更多的是探讨一种实现的可能性和思路,和实际应用还是 ...

  7. HDS(日立)AMS2000系列存储管理配置方法

    转自:老管网络日志 配置日立存储AMS2000系列时也要和IBM存储一样,首先在客户端或者管理机上安装一个客户端,通过这个客户端再去管理存储. 管理软件名称为Storage Navigator Mod ...

  8. java 多线程9 : synchronized锁机制 之 代码块锁

    synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用 ...

  9. IOS之TableViewCell重用机制避免重复显示问题

    常规配置如下 当超过tableView显示的范围的时候 后面显示的内容将会和前面重复. 1 // 这样配置的话超过页面显示的内容会重复出现 2 - (UITableViewCell *)tableVi ...

  10. 设计和开发ETL系统(一)——ETL过程综述

    在这部分将按照设计和实现ETL系统的流程展开,将上一个部分的那些子系统按照提取数据.清洗和一致化.向呈现服务器提交以及管理ETL环境等四个方面进行了分类.(是不是说对ETL主要就是掌握这四个方面的内容 ...