VC++ 操作Windows快捷方式
声明:本文是参考网友博文,然后自己实践整理所得,转载请注明出处!
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快捷方式的更多相关文章
- vc操作windows防火墙的方法
收藏该地址,以备不时之需. http://msdn.microsoft.com/en-us/library/aa364726.aspx
- C语言操作WINDOWS系统存储区数字证书相关函数详解及实例
C语言操作WINDOWS系统存储区数字证书相关函数详解及实例 以下代码使用C++实现遍历存储区证书及使用UI选择一个证书 --使用CertOpenSystemStore打开证书存储区. --在循环中 ...
- 全键盘操作Windows
计算机机用户在使用计算机的时候,是用键盘多一点?还是用鼠标多一点?如果是专业打字员,应该会说他使用键盘多一点,除此之外,多数人都会告诉你,他已经离不开鼠标了,没有鼠标,就不会操作电脑. 如果某一天 ...
- VC+++ 操作word
最近完成了一个使用VC++ 操作word生成扫描报告的功能,在这里将过程记录下来,开发环境为visual studio 2008 导入接口 首先在创建的MFC项目中引入word相关组件 右键点击 项目 ...
- winreg操作windows注册表详解示例
#coding:utf-8 #=====================================================================#=====本程序演示了WINR ...
- VC操作excel
http://www.cnblogs.com/witxjp/archive/2010/06/05/1752181.html 最近在做个数据库程序,因为有些数据用户要求导出到Excel文件显示(需要 ...
- C# 操作windows服务[启动、停止、卸载、安装]
主要宗旨:不已命令形式操作windows服务 static void Main(string[] args) { var path = @"E:\开发辅助项目\WCF\WCF.Test\WC ...
- VC++实现解析快捷方式
VC++实现解析快捷方式: http://blog.csdn.net/mydreamremindme/article/details/9826745
- C#通过SC命令和静态公共类来操作Windows服务
调用的Windows服务应用程序网址:http://www.cnblogs.com/pingming/p/5115304.html 一.引用 二.公共静态类:可以单独放到类库里 using Syste ...
随机推荐
- 无线路由器硬件配置參数 NetGear篇
NetGear WNDR4500(号称地球上最强的无线路由器) 450Mbps+450Mbps 京东¥1399 0MHz.配备了128MB的内存和128MB的闪存,再以 ...
- 怎样设置linux中Tab键的宽度(可永久设置)
和我的上篇文章一样,能够设置当前用户的Tab键宽度.也能够设置全部用户的Tab键宽度 一.仅设置当前用户的Tab键宽度 输入命令:vim ~/.vimrc 然后:set tabstop=4 //我 ...
- angular学习笔记(二十二)-$http.post
基本语法: $http.post('url',{},{}).success(function(data,status,headers,config){ }).error(function(data,s ...
- Linux命令(24) :sort
转载地址:点击 linux 命令详解 sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比 ...
- 李洪强iOS之集成极光推送一iOS SDK概述
李洪强iOS之集成极光推送一iOS SDK概述 JPush iOS 从上图可以看出,JPush iOS Push 包括 2 个部分,APNs 推送(代理),与 JPush 应用内消息. 红色部分是 A ...
- DirectUI的初步分析-转
DirectUI的初步分析(一) 最近由于项目的需要学习了一下DirectUI方面的东西,主要借鉴的是一个国外程序员写的代码(见引用一),看了后发现它更多的是探讨一种实现的可能性和思路,和实际应用还是 ...
- HDS(日立)AMS2000系列存储管理配置方法
转自:老管网络日志 配置日立存储AMS2000系列时也要和IBM存储一样,首先在客户端或者管理机上安装一个客户端,通过这个客户端再去管理存储. 管理软件名称为Storage Navigator Mod ...
- java 多线程9 : synchronized锁机制 之 代码块锁
synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用 ...
- IOS之TableViewCell重用机制避免重复显示问题
常规配置如下 当超过tableView显示的范围的时候 后面显示的内容将会和前面重复. 1 // 这样配置的话超过页面显示的内容会重复出现 2 - (UITableViewCell *)tableVi ...
- 设计和开发ETL系统(一)——ETL过程综述
在这部分将按照设计和实现ETL系统的流程展开,将上一个部分的那些子系统按照提取数据.清洗和一致化.向呈现服务器提交以及管理ETL环境等四个方面进行了分类.(是不是说对ETL主要就是掌握这四个方面的内容 ...