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 工程的数字证书: 此程序创建可份自我签署的数字证书,该证书仅可在本机上用于个人 宏。 请按任意键继续. . .
相关文章推荐
- 通过LNK文件(快捷方式)解析出目标文件的路径
- Windows快捷方式文件格式解析
- vs2010打包程序制作的快捷方式指向错误的位置(指向安装包文件) 导致每次启动都要windows正在配置
- 【转载】C++实现在桌面创建程序的快捷方式
- WINDOWS快捷方式(*.lnk文件)打开方式关联错误的解决方法
- Windows快捷方式文件格式解析
- WINDOWS快捷方式(*.lnk文件)打开方式关联错误的解决方法
- C++实现在桌面创建程序的快捷方式
- 【转】Windows快捷方式文件格式解析(中文)
- Windows快捷方式文件格式解析
- 快捷方式 .lnk文件不是有效的win32程序
- Windows快捷方式文件格式解析
- Java 解析 lnk 快捷方式文件的方法(转)
- C++实现在桌面创建程序的快捷方式
- 不小心设置成WINDOWS快捷方式(*.lnk文件)都以一种打开方式打开的 解决方法
- Windows快捷方式文件格式解析
- Windows下c++创建快捷方式
- Windows下c++创建快捷方式
- Windows快捷方式文件格式解析
- WINDOWS快捷方式(*.lnk文件)打开方式关联错误的解决方法!