65.9K
CodeProject 正在变化。 阅读更多。
Home

CShortcut(指向特殊文件夹的 Shell 链接)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (44投票s)

2004 年 5 月 9 日

4分钟阅读

viewsIcon

177939

downloadIcon

4508

这个类使您能够创建指向任何文件/文件夹(如“开始”菜单、“发送到”上下文菜单等)的快捷方式。

Sample Image - CShortcut.gif

引言

这个类使您能够轻松创建 Shell 链接(快捷方式),就像您在 Windows 中随处可见的那样(例如:在桌面上,“发送到”上下文菜单中,“开始”菜单中......)。您还可以为链接添加描述或命令行参数。使用这个类创建快捷方式真的非常简单。请查看演示项目,看看它有多容易!

关于演示项目的一些说明

  • 每次写入快捷方式且程序运行时,图标都会更改。图标是从 shell32.dll 中提取的。
  • 此演示程序写入的链接名称始终是“Test Link”,无论链接创建在哪个文件夹中。
  • 程序启动时,它会检测是否存在快捷方式。如果存在,选项按钮旁边的文本
    将更改,文本颜色也将变为红色。如果没有,文本将为蓝色。写入或删除链接时也会发生同样的情况。
  • 如果您在“发送到”菜单中创建链接,您可以这样测试它
    • 在“发送到”上下文菜单中创建一个快捷方式
    • 打开资源管理器,右键单击文件并选择“发送到”菜单项
    • 现在会弹出另一个菜单,您应该选择“Test Link
    • CShortcut 演示程序启动,一个消息框会显示您“发送到”的文件的路径和文件名。

SendTo Messagebox Img

使用代码

1. 将文件 Shortcut.h 和 Shortcut.cpp 添加到您的项目中并包含头文件

#include "Shortcut.h"

2. 创建 CShortcut 类的一个变量。例如

m_pShortcut // a pointer to CShortcut

3.1. 如果需要命令行参数,请调用 SetCmdArguments 函数

SetCmdArguments(CString sArg)

CString 是您需要与文件一起调用的参数

3.2 调用 CreateShortCut 函数创建快捷方式(函数名说明了一切 ;-))

CreateShortCut(CString LnkTarget,
               CString LnkName,
               UINT SpecialFolder,
               CString LnkDescription,
               CString IconLocation,
               UINT IconIndex)
  • LnkTarget 链接指向的文件/文件夹
  • LnkName 快捷方式的名称
  • SpecialFolder 将快捷方式放置的位置(见下文,或查看
    MSDN --> SHGetSpecialFolderLocation 以获取更多文件夹)
  • LnkDescription 应用程序可以使用它存储任何文本信息,并且可以
    使用“IShellLink::GetDescription”检索它
  • IconLocation 包含要使用的图标的文件的路径。可以是一个
    空字符串
  • IconIndex 文件中图标的索引

    SpecialFolder 的定义

定义

描述

CSIDL_SENDTO

发送到菜单/文件夹

CSIDL_DESKTOP

当前用户的桌面

CSIDL_COMMON_DESKTOP

所有用户的桌面

CSIDL_STARTUP

当前用户的自动启动

CSIDL_COMMON_STARTUP

所有用户的自动启动

CSIDL_STARTMENU

当前用户的开始菜单

CSIDL_COMMON_STARTMENU

所有用户的开始菜单

CSIDL_PROGRAMS

当前用户的程序菜单

还有更多...

4. 您想删除快捷方式?好的,继续阅读。只需使用 DeleteShortCut

DeleteShortCut(CString LnkName, UINT SpecialFolder)
  • LnkName 快捷方式的名称
  • SpecialFolder 再次是一个特殊文件夹的定义(见 CreateShortCut)

5. 您想检测快捷方式?那么使用 isLinkAvailable

isLinkAvailable(CString LnkName, UINT SpecialFolder)
  • LnkName 快捷方式的名称
  • SpecialFolder 再次是一个特殊文件夹的定义(见 CreateShortcut)

6. 现在您可以解析并检索快捷方式的描述,使用

ResolveLink(CString LnkName,
            UINT SpecialFolder,
            HWND hwnd,
            CString &LnkPath,
            CString &LnkDescription)
  • LnkName 快捷方式的名称
  • SpecialFolder 快捷方式的位置
  • hwnd 父窗口的句柄,用于 shell 可能显示的任何消息框。
  • &LnkPath 接收对象路径的字符串引用
  • &LnkDescription 接收链接描述的字符串引用

7. 还有两个内部使用的 私有 辅助例程

  • GetSpecialFolder 这个例程是一个辅助函数,用于查找特殊文件夹的路径
  • ShortToLongPathName 这个例程是一个辅助函数,用于从 8.3 格式构建长路径。我知道存在一个名为 GetLongPathName 的函数,但我有一半时间在使用“旧”的 NT4 系统,而这个函数在那里不可用!

现在您已准备好在您的计算机上创建指向任何内容的链接。>B-}

致谢

我要感谢通过他或她出色的代码使这个类成为可能的程序员
IShellLink 实现!我真的不记得在哪里找到的了。抱歉!还要感谢 Michael Dunn 撰写的精彩文章 COM 简介 - 它是什么以及如何使用它

这样做的原因

我需要让我的一个小应用程序的用户可以选择通过
右键单击“发送到”菜单将文件发送到我的程序。经过几个小时的搜索,我有了足够的材料和信息来开发这个类(我第一次接触 COM 技术)。

您不仅可以将可执行文件放入“发送到”菜单,还可以放入文件夹,这对于搜索和收集一些文件并稍后压缩它们(例如)非常有用。您会发现使用链接可以做很多有用的事情。另一种可能性是将某些东西链接到控制面板。或者您可以......

历史

2004年5月12日 - 添加了解析 ShellLink 的例程

© . All rights reserved.