C++在指定路径创建快捷方式

举报
福州司马懿 发表于 2024/10/30 10:16:07 2024/10/30
【摘要】 在C++中,要在指定路径创建一个快捷方式(.lnk 文件),你可以使用 Windows Shell 的 COM 接口 IShellLink 和 IPersistFile。这些接口允许你创建一个快捷方式的对象,设置其目标、工作目录、图标等属性,然后将其保存到磁盘上。以下是一个使用这些接口在指定路径创建快捷方式的示例代码:#include <windows.h>#include <comdef....

在C++中,要在指定路径创建一个快捷方式(.lnk 文件),你可以使用 Windows Shell 的 COM 接口 IShellLinkIPersistFile。这些接口允许你创建一个快捷方式的对象,设置其目标、工作目录、图标等属性,然后将其保存到磁盘上。

以下是一个使用这些接口在指定路径创建快捷方式的示例代码:

#include <windows.h>
#include <comdef.h>
#include <shlwapi.h> // 包含PathCombine等函数
#include <shellapi.h> // 包含IShellLink等接口的定义(通过#include <shobjidl.h>间接包含)
#include <shobjidl.h> // 直接包含以确保IShellLink等接口可用
#include <tchar.h>

#pragma comment(lib, "shlwapi.lib")
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "oleaut32.lib")

void CreateShortcut(const TCHAR* targetPath, const TCHAR* shortcutPath, const TCHAR* description = NULL, const TCHAR* workingDir = NULL, const TCHAR* iconPath = NULL)
{
    // 初始化COM库
    CoInitialize(NULL);

    // 创建IShellLink接口实例
    IShellLink* pShellLink = NULL;
    HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pShellLink);
    if (FAILED(hr))
    {
        _tprintf(_T("Failed to create IShellLink instance. Error: %08X\n"), hr);
        CoUninitialize();
        return;
    }

    // 设置快捷方式的目标路径
    hr = pShellLink->SetPath(targetPath);
    if (FAILED(hr))
    {
        _tprintf(_T("Failed to set target path. Error: %08X\n"), hr);
        pShellLink->Release();
        CoUninitialize();
        return;
    }

    // 如果提供了工作目录,则设置它
    if (workingDir)
    {
        hr = pShellLink->SetWorkingDirectory(workingDir);
        if (FAILED(hr))
        {
            _tprintf(_T("Failed to set working directory. Error: %08X\n"), hr);
        }
    }

    // 如果提供了图标路径,则设置它
    if (iconPath)
    {
        int iconIndex = 0; // 图标索引,通常为0表示第一个图标
        hr = pShellLink->SetIconLocation(iconPath, iconIndex);
        if (FAILED(hr))
        {
            _tprintf(_T("Failed to set icon location. Error: %08X\n"), hr);
        }
    }

    // 如果提供了描述,则设置它(注意:描述通常通过IPersistFile::Save后的Shell属性设置,但这里不直接支持)
    // 描述可以通过后续使用IShellLinkW::SetDescription设置(需要IShellLinkW接口),但这里为了简单起见省略

    // 创建IPersistFile接口实例
    IPersistFile* pPersistFile = NULL;
    hr = pShellLink->QueryInterface(IID_IPersistFile, (void**)&pPersistFile);
    if (FAILED(hr))
    {
        _tprintf(_T("Failed to get IPersistFile interface. Error: %08X\n"), hr);
        pShellLink->Release();
        CoUninitialize();
        return;
    }

    // 保存快捷方式到指定路径
    hr = pPersistFile->Save(shortcutPath, TRUE);
    if (FAILED(hr))
    {
        _tprintf(_T("Failed to save shortcut. Error: %08X\n"), hr);
    }

    // 释放接口实例
    pPersistFile->Release();
    pShellLink->Release();

    // 取消初始化COM库
    CoUninitialize();
}

int main()
{
    // 示例:在桌面上创建一个指向记事本(Notepad)的快捷方式
    TCHAR targetPath[] = _T("C:\\Windows\\System32\\notepad.exe");
    TCHAR desktopPath[MAX_PATH];
    SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, SHGFP_TYPE_CURRENT, desktopPath);
    TCHAR shortcutPath[MAX_PATH];
    PathCombine(shortcutPath, desktopPath, _T("Notepad Shortcut.lnk"));

    CreateShortcut(targetPath, shortcutPath, _T("Notepad Shortcut"), NULL, NULL);

    return 0;
}

注意

  • 你需要链接 shlwapi.libole32.liboleaut32.lib 库,这些库提供了必要的函数和接口。
  • SHGetFolderPath 函数用于获取桌面的路径,但请注意,在较新的 Windows 版本中,它已被 SHGetKnownFolderPath 取代。为了兼容性,这里仍然使用 SHGetFolderPath
  • PathCombine 函数用于将桌面路径和快捷方式文件名组合成一个完整的路径。
  • 快捷方式的描述(description 参数)通常不是通过 IShellLink::SetDescription 直接设置的,因为 IShellLink 接口没有这个方法。描述通常是在快捷方式文件创建后,通过 Shell 属性设置的。但是,如果你需要设置描述,你可以使用 IShellLinkW 接口(Unicode 版本)的 SetDescription 方法,并相应地更改代码以使用宽字符字符串和接口。
  • 在实际的应用程序中,你应该添加错误处理代码来处理各种可能的失败情况。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。