本例程用到的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 (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);
}
else
printf("解析快捷方式%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;
else
cout << "创建快捷方式" << name << "失败" << endl;
file->Release();
}
link->Release();
}
}
// 解析快捷方式
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_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;
}
else
cout << "解析快捷方式" << 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 创建和编辑具有专业外观的文档,如信函、论文、报告和小册
子。
请按任意键继续. . .