本例程用到的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