C语言或C++通过IShellLinkA创建或解析lnk快捷方式(使用char字符数组)

本文主要是介绍C语言或C++通过IShellLinkA创建或解析lnk快捷方式(使用char字符数组),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本例程用到的COM接口有IShellLinkA和IPersistFile。
请注意因为函数参数的类型不为BSTR,所以这两个接口可直接传char *或wchar_t *字符串,不需要提前转化为BSTR类型。

C语言的写法:

/* 这个程序只能在C编译器下编译成功, 请确保源文件的扩展名为c */
#define COBJMACROS
#include <stdio.h>
#include <ShObjIdl.h>// char *字符串转wchar_t *字符串
wchar_t *gb2312_to_utf16(const char *s)
{int n;wchar_t *ws;n = MultiByteToWideChar(CP_ACP, 0, s, -1, NULL, 0);ws = calloc(n, sizeof(wchar_t));if (ws != NULL)MultiByteToWideChar(CP_ACP, 0, s, -1, ws, n);return ws;
}// 创建快捷方式
void create_shortcut(const char *name, const char *target, const char *desc)
{wchar_t *ws;IPersistFile *file;IShellLinkA *link;HRESULT hr;hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkA, &link);if (SUCCEEDED(hr)){// 以下两个函数可直接传char *字符串IShellLinkA_SetPath(link, target);IShellLinkA_SetDescription(link, desc);hr = IShellLinkA_QueryInterface(link, &IID_IPersistFile, &file);if (SUCCEEDED(hr)){ws = gb2312_to_utf16(name);hr = IPersistFile_Save(file, ws, TRUE); // 第二个参数不是BSTR类型, 而是LPCOLESTR类型, 直接传wchar_t *字符串即可// 第三个参数决定是否将此文件用作后续的工作文件free(ws);if (SUCCEEDED(hr))printf("创建快捷方式%s成功\n", name);elseprintf("创建快捷方式%s失败\n", name);IPersistFile_Release(file);}IShellLinkA_Release(link);}
}// 解析快捷方式
void read_shortcut(const char *name)
{char target[MAX_PATH]; // 在Windows系统中, 路径的最大长度是MAX_PATHchar desc[INFOTIPSIZE]; // 在Windows系统中, 快捷方式描述的最大长度是INFOTIPSIZEwchar_t *ws;IPersistFile *file;IShellLinkA *link;HRESULT hr;hr = CoCreateInstance(&CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkA, &link);if (SUCCEEDED(hr)){hr = IShellLinkA_QueryInterface(link, &IID_IPersistFile, &file);if (SUCCEEDED(hr)){ws = gb2312_to_utf16(name);hr = IPersistFile_Load(file, ws, STGM_READ);free(ws);if (SUCCEEDED(hr)){printf("解析快捷方式%s成功\n", name);hr = IShellLinkA_GetPath(link, target, MAX_PATH, NULL, SLGP_RAWPATH);if (SUCCEEDED(hr))printf("链接目标: %s\n", target);hr = IShellLinkA_GetDescription(link, desc, INFOTIPSIZE);if (SUCCEEDED(hr))printf("描述: %s\n", desc);}elseprintf("解析快捷方式%s失败\n", name);IPersistFile_Release(file);}IShellLinkA_Release(link);}
}// 解析开始菜单中Office 2010的所有快捷方式
void read_office2010_links()
{char *folder = "C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\Microsoft Office";char path[MAX_PATH];HANDLE find;WIN32_FIND_DATAA find_data;// 请注意: _s结尾的字符串操作函数, 凡是命名为MaxCount的参数, 都要记得减去1, 否则字符数组刚好满的时候程序会崩溃_snprintf_s(path, sizeof(path), sizeof(path) - 1, "%s\\*.lnk", folder);find = FindFirstFileA(path, &find_data);if (find != INVALID_HANDLE_VALUE){do{_snprintf_s(path, sizeof(path), sizeof(path) - 1, "%s\\%s", folder, find_data.cFileName);read_shortcut(path);} while (FindNextFileA(find, &find_data));FindClose(find);}
}int main()
{CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);create_shortcut("示例快捷方式.lnk", "C:\\WINDOWS\\system32\\shell32.dll", "Windows XP界面真好看啊!");read_shortcut("示例快捷方式.lnk");read_office2010_links();CoUninitialize();return 0;
}

C++的写法:

#include <iostream>
#include <ShObjIdl.h>using namespace std;// char *字符串转wchar_t *字符串
wchar_t *gb2312_to_utf16(const char *s)
{int n;wchar_t *ws;n = MultiByteToWideChar(CP_ACP, 0, s, -1, NULL, 0);ws = new wchar_t[n];if (ws != NULL)MultiByteToWideChar(CP_ACP, 0, s, -1, ws, n);return ws;
}// 创建快捷方式
void create_shortcut(const char *name, const char *target, const char *desc)
{wchar_t *ws;IPersistFile *file;IShellLinkA *link;HRESULT hr;hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&link));if (SUCCEEDED(hr)){// 以下两个函数可直接传char *字符串link->SetPath(target);link->SetDescription(desc);hr = link->QueryInterface(&file);if (SUCCEEDED(hr)){ws = gb2312_to_utf16(name);hr = file->Save(ws, TRUE); // 第一个参数不是BSTR类型, 而是LPCOLESTR类型, 直接传wchar_t *字符串即可// 第二个参数决定是否将此文件用作后续的工作文件delete[] ws;if (SUCCEEDED(hr))cout << "创建快捷方式" << name << "成功" << endl;elsecout << "创建快捷方式" << name << "失败" << endl;file->Release();}link->Release();}
}// 解析快捷方式
void read_shortcut(const char *name)
{char target[MAX_PATH]; // 在Windows系统中, 路径的最大长度是MAX_PATHchar desc[INFOTIPSIZE]; // 在Windows系统中, 快捷方式描述的最大长度是INFOTIPSIZEwchar_t *ws;IPersistFile *file;IShellLinkA *link;HRESULT hr;hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&link));if (SUCCEEDED(hr)){hr = link->QueryInterface(&file);if (SUCCEEDED(hr)){ws = gb2312_to_utf16(name);hr = file->Load(ws, STGM_READ);delete[] ws;if (SUCCEEDED(hr)){cout << "解析快捷方式" << name << "成功" << endl;hr = link->GetPath(target, MAX_PATH, NULL, SLGP_RAWPATH);if (SUCCEEDED(hr))cout << "链接目标: " << target << endl;hr = link->GetDescription(desc, INFOTIPSIZE);if (SUCCEEDED(hr))cout << "描述: " << desc << endl;}elsecout << "解析快捷方式" << name << "失败" << endl;file->Release();}link->Release();}
}// 解析开始菜单中Office 2010的所有快捷方式
void read_office2010_links()
{char *folder = "C:\\Documents and Settings\\All Users\\「开始」菜单\\程序\\Microsoft Office";char path[MAX_PATH];HANDLE find;WIN32_FIND_DATAA find_data;// 请注意: _s结尾的字符串操作函数, 凡是命名为MaxCount的参数, 都要记得减去1, 否则字符数组刚好满的时候程序会崩溃_snprintf_s(path, sizeof(path) - 1, "%s\\*.lnk", folder);find = FindFirstFileA(path, &find_data);if (find != INVALID_HANDLE_VALUE){do{_snprintf_s(path, sizeof(path) - 1, "%s\\%s", folder, find_data.cFileName);read_shortcut(path);} while (FindNextFileA(find, &find_data));FindClose(find);}
}int main()
{CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);create_shortcut("示例快捷方式.lnk", "C:\\WINDOWS\\system32\\shell32.dll", "Windows XP界面真好看啊!");read_shortcut("示例快捷方式.lnk");read_office2010_links();CoUninitialize();return 0;
}

程序创建的lnk快捷方式:

程序运行结果:

创建快捷方式示例快捷方式.lnk成功
解析快捷方式示例快捷方式.lnk成功
链接目标: C:\WINDOWS\system32\shell32.dll
描述: Windows XP界面真好看啊!
解析快捷方式C:\Documents and Settings\All Users\「开始」菜单\程序\Microsoft Offi
ce\Microsoft Access 2010.lnk成功
链接目标: C:\WINDOWS\Installer\{90140000-0011-0000-0000-0000000FF1CE}\accicons.e
xe
描述: 使用 Microsoft Access 创建数据库和程序来跟踪与管理信息。
解析快捷方式C:\Documents and Settings\All Users\「开始」菜单\程序\Microsoft Offi
ce\Microsoft Excel 2010.lnk成功
链接目标: C:\WINDOWS\Installer\{90140000-0011-0000-0000-0000000FF1CE}\xlicons.ex
e
描述: 使用 Microsoft Excel 执行计算、分析信息以及可视化电子表格中的数据。
解析快捷方式C:\Documents and Settings\All Users\「开始」菜单\程序\Microsoft Offi
ce\Microsoft InfoPath Designer 2010.lnk成功
链接目标: C:\WINDOWS\Installer\{90140000-0011-0000-0000-0000000FF1CE}\inficon.ex
e
描述: 使用 Microsoft InfoPath 设计动态表单,以便在整个组织中收集和重用信息。
解析快捷方式C:\Documents and Settings\All Users\「开始」菜单\程序\Microsoft Offi
ce\Microsoft InfoPath Filler 2010.lnk成功
链接目标: C:\WINDOWS\Installer\{90140000-0011-0000-0000-0000000FF1CE}\inficon.ex
e
描述: 使用 Microsoft InfoPath 填写动态表单,以便在整个组织中收集和重用信息。
解析快捷方式C:\Documents and Settings\All Users\「开始」菜单\程序\Microsoft Offi
ce\Microsoft OneNote 2010.lnk成功
链接目标: C:\WINDOWS\Installer\{90140000-0011-0000-0000-0000000FF1CE}\joticon.ex
e
描述: 使用 Microsoft OneNote 搜集、组织、查找和共享您的笔记和信息。
解析快捷方式C:\Documents and Settings\All Users\「开始」菜单\程序\Microsoft Offi
ce\Microsoft Outlook 2010.lnk成功
链接目标: C:\WINDOWS\Installer\{90140000-0011-0000-0000-0000000FF1CE}\outicon.ex
e
描述: 使用 Microsoft Outlook 发送和接收电子邮件;管理日程、联系人和任务;以及记
录活动。
解析快捷方式C:\Documents and Settings\All Users\「开始」菜单\程序\Microsoft Offi
ce\Microsoft PowerPoint 2010.lnk成功
链接目标: C:\WINDOWS\Installer\{90140000-0011-0000-0000-0000000FF1CE}\pptico.exe描述: 使用 Microsoft PowerPoint 创建和编辑用于幻灯片播放、会议和网页的演示文稿。解析快捷方式C:\Documents and Settings\All Users\「开始」菜单\程序\Microsoft Offi
ce\Microsoft Project 2010.lnk成功
链接目标: C:\WINDOWS\Installer\{90140000-003B-0000-0000-0000000FF1CE}\pj11icon.e
xe
描述: 使用 Microsoft Project 计划、跟踪和管理项目,以及与工作组交流。
解析快捷方式C:\Documents and Settings\All Users\「开始」菜单\程序\Microsoft Offi
ce\Microsoft Publisher 2010.lnk成功
链接目标: C:\WINDOWS\Installer\{90140000-0011-0000-0000-0000000FF1CE}\pubs.exe
描述: 使用 Microsoft Publisher 创建新闻稿和小册子等专业品质出版物及营销素材。
解析快捷方式C:\Documents and Settings\All Users\「开始」菜单\程序\Microsoft Offi
ce\Microsoft SharePoint Workspace 2010.lnk成功
链接目标: C:\WINDOWS\Installer\{90140000-0011-0000-0000-0000000FF1CE}\grvicons.e
xe
描述: 使用 Microsoft SharePoint Workspace 将 SharePoint 网站同步到您的计算机并处
理其内容,就像始终连接到网站一样。
解析快捷方式C:\Documents and Settings\All Users\「开始」菜单\程序\Microsoft Offi
ce\Microsoft Visio 2010.lnk成功
链接目标: C:\WINDOWS\Installer\{90140000-0057-0000-0000-0000000FF1CE}\visicon.ex
e
描述: 使用 Microsoft Visio 创建、编辑和共享图表。
解析快捷方式C:\Documents and Settings\All Users\「开始」菜单\程序\Microsoft Offi
ce\Microsoft Word 2010.lnk成功
链接目标: C:\WINDOWS\Installer\{90140000-0011-0000-0000-0000000FF1CE}\wordicon.e
xe
描述: 使用 Microsoft Word 创建和编辑具有专业外观的文档,如信函、论文、报告和小册
子。
请按任意键继续. . .

这篇关于C语言或C++通过IShellLinkA创建或解析lnk快捷方式(使用char字符数组)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/640783

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�