您的位置:首页 > 编程语言 > C语言/C++

C++创建和解析Windows快捷方式文件lnk的程序

2018-02-06 13:07 495 查看
#include <iostream>
#include <ShObjIdl.h>
#include <strsafe.h>

using namespace std;

#define TARGET TEXT("C:\\WINDOWS\\system32\\shell32.dll") // 快捷方式链接目标
#define LNKFILE L"example.lnk"

// 给cout添加输出Unicode字符串的功能
#ifdef _UNICODE
ostream &operator << (ostream &os, LPCWSTR lpwstr)
{
if (os == cout)
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), lpwstr, wcslen(lpwstr), NULL, NULL);
return os;
}
#endif

// 创建快捷方式
void CreateShortcut(void)
{
IShellLink *psl;
HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&psl));
if (SUCCEEDED(hr))
{
psl->SetPath(TARGET);
psl->SetDescription(TEXT("This is just an example."));

IPersistFile *ppf;
hr = psl->QueryInterface(&ppf);
if (SUCCEEDED(hr))
{
hr = ppf->Save(LNKFILE, TRUE);
if (SUCCEEDED(hr))
cout << TEXT("创建快捷方式成功") << endl;
else
cout << TEXT("创建快捷方式失败") << endl;
ppf->Release();
}
else
cout << TEXT("创建快捷方式时遇到系统错误") << endl;

psl->Release();
}
else
cout << TEXT("操作失败") << endl;
}

// 解析快捷方式
void ResolveShortcut(void)
{
IShellLink *psl;
HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&psl));
if (SUCCEEDED(hr))
{
IPersistFile *ppf;
hr = psl->QueryInterface(&ppf);
if (SUCCEEDED(hr))
{
hr = ppf->Load(LNKFILE, STGM_READ);
if (SUCCEEDED(hr))
{
TCHAR szPath[MAX_PATH];
TCHAR szDesc[INFOTIPSIZE];
hr = psl->GetPath(szPath, MAX_PATH, NULL, SLGP_RAWPATH);
if (SUCCEEDED(hr))
cout << TEXT("快捷方式指向的文件: ") << szPath << endl;
else
cout << TEXT("获取快捷方式指向的文件失败!") << endl;
hr = psl->GetDescription(szDesc, INFOTIPSIZE);
if (SUCCEEDED(hr))
cout << TEXT("描述: ") << szDesc << endl;
else
cout << TEXT("获取快捷方式描述失败!") << endl;
}
else
cout << TEXT("打开文件失败") << endl;
ppf->Release();
}
else
cout << TEXT("读取文件时遇到系统错误") << endl;
psl->Release();
}
else
cout << TEXT("操作失败") << endl;
}

// 解析开始菜单中Office2010的所有快捷方式
void Office2010Desc(void)
{
TCHAR szFolder[MAX_PATH] = TEXT("C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\Microsoft Office\\");
TCHAR szPath[MAX_PATH];

HANDLE hFind;
int flag;
for (flag = 0; flag <= 1; flag++)
{
if (flag == 1)
{
StringCchCat(szFolder, MAX_PATH, TEXT("Microsoft Office 2010 工具\\"));
if (hFind != INVALID_HANDLE_VALUE)
cout << endl << endl << endl;
}

WIN32_FIND_DATA data;
StringCchCopy(szPath, MAX_PATH, szFolder);
StringCchCat(szPath, MAX_PATH, TEXT("*.lnk"));
hFind = FindFirstFile(szPath, &data);
if (hFind == INVALID_HANDLE_VALUE)
{
cout << szPath << TEXT(" doesn't exist!") << endl;
continue;
}
do
{
TCHAR szDesc[INFOTIPSIZE + 2] = TEXT(": ");
IShellLink *psl;
HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&psl));
if (SUCCEEDED(hr))
{
IPersistFile *ppf;
hr = psl->QueryInterface(&ppf);
if (SUCCEEDED(hr))
{
StringCchCopy(szPath, MAX_PATH, szFolder);
StringCchCat(szPath, MAX_PATH, data.cFileName);
#ifdef _UNICODE
hr = ppf->Load(szPath, STGM_READ);
#else
WCHAR szwPath[MAX_PATH];
MultiByteToWideChar(CP_ACP, NULL, szPath, -1, szwPath, MAX_PATH);
hr = ppf->Load(szwPath, STGM_READ);
#endif

if (SUCCEEDED(hr))
{
hr = psl->GetDescription(szDesc + 2, INFOTIPSIZE);
if (FAILED(hr))
szDesc[0] = '\0';
}
ppf->Release();
}
psl->Release();
}

int len = lstrlen(data.cFileName);
data.cFileName[len - 4] = '\0';
cout << data.cFileName << szDesc << endl;
} while (FindNextFile(hFind, &data));
FindClose(hFind);
}
}

int main(void)
{
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

CreateShortcut();
ResolveShortcut();
Office2010Desc();

CoUninitialize();
system("pause");
return 0;
}


创建的快捷方式:



程序运行结果:

创建快捷方式成功
快捷方式指向的文件: C:\WINDOWS\system32\shell32.dll
描述: This is just an example.
Microsoft Access 2010: 使用 Microsoft Access 创建数据库和程序来跟踪与管理信息。
Microsoft Excel 2010: 使用 Microsoft Excel 执行计算、分析信息以及可视化电子表格
中的数据。
Microsoft OneNote 2010: 使用 Microsoft OneNote 搜集、组织、查找和共享您的笔记和
信息。
Microsoft Outlook 2010: 使用 Microsoft Outlook 发送和接收电子邮件;管理日程、联
系人和任务;以及记录活动。
Microsoft PowerPoint 2010: 使用 Microsoft PowerPoint 创建和编辑用于幻灯片播放、
会议和网页的演示文稿。
Microsoft Publisher 2010: 使用 Microsoft Publisher 创建新闻稿和小册子等专业品质
出版物及营销素材。
Microsoft Word 2010: 使用 Microsoft Word 创建和编辑具有专业外观的文档,如信函、
论文、报告和小册子。

Microsoft Office 2010 上载中心: 通过 Microsoft Office 上载中心管理到 Web 服务器
的文件上载。
Microsoft Office 2010 语言首选项: 更改 Office 应用程序的语言首选项。
Microsoft Office Picture Manager: 使用 Microsoft Office Picture Manager 组织、编
辑和共享图片文件。
Microsoft 剪辑管理器: 使用 Microsoft 剪辑管理器导入和组织照片、剪贴画、声音和动
画文件。
Office Anytime Upgrade: Microsoft Office Anytime Upgrade Tool
VBA 工程的数字证书: 此程序创建可份自我签署的数字证书,该证书仅可在本机上用于个人
宏。
请按任意键继续. . .
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  win32