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);
			else
				printf("创建快捷方式%s失败\n", name);
			IPersistFile_Release(file);
		}
		IShellLinkA_Release(link);
	}
}

// 解析快捷方式
void read_shortcut(const char *name)
{
	char target[MAX_PATH]; // 在Windows系统中, 路径的最大长度是MAX_PATH
	char desc[INFOTIPSIZE]; // 在Windows系统中, 快捷方式描述的最大长度是INFOTIPSIZE
	wchar_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 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巨大八爪鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值