winapi 创建快捷方式失败

winapi create shortcut failed

我想创建一个文件的快捷方式。我发现 this Microsoft page 描述了如何编写它,我将其复制到我的代码中以供使用。 但是我有一些问题,首先它有以下错误:“CoInitialize has not been called.” 我添加这个 CoInitialize(nullptr); 来解决错误,但我仍然有错误。

当我调试它时,它在这一行出现 "Information not available, no symbols loaded for windows.storage.dll" 错误:

hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);

执行后,当我看到目标路径时,它创建了一个具有名称的快捷方式,但我无法打开它,而且它没有任何内容。

这有什么问题吗?

这个错误是否造成了这个问题?

我正在使用 VS 2012。

已编辑代码:

// #include "stdafx.h"
#include "windows.h"
#include "shobjidl.h"
#include <iostream>
#include <shlwapi.h>
#include "objbase.h"
#include "objidl.h"
#include "shlguid.h"

HRESULT CreateLink(LPCWSTR, LPCWSTR, LPCWSTR);

void wmain(int argc, wchar_t* argv[ ], wchar_t* envp[ ])
{

    WCHAR lpwSource[MAX_PATH] = {0};
    lstrcpyW(lpwSource, (LPCWSTR)argv[1]);

    WCHAR lpwDest[MAX_PATH] = {0};
    lstrcpyW(lpwDest, (LPCWSTR)argv[2]);

    HRESULT hResult = 0;
    hResult = CreateLink(lpwSource, lpwDest, NULL);

    if (hResult == S_OK) {

        printf("Shortcut was created successfully.\n");

    } else {

        printf("Shortcut creation failed.\n");

    }

    getchar();
}

HRESULT CreateLink(LPCWSTR lpszPathObj, LPCWSTR lpszPathLink, LPCWSTR lpszDesc)
{
    HRESULT hres = 0;
    IShellLink* psl;

    HRESULT hCoInit = 0;
    hCoInit = CoInitialize(nullptr);

    // Get a pointer to the IShellLink interface. It is assumed that CoInitialize
    // has already been called.
    hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
    if (SUCCEEDED(hres)) {
        IPersistFile* ppf;

        // Set the path to the shortcut target and add the description. 
        psl->SetPath(lpszPathObj);
        psl->SetDescription(lpszDesc);

        // Query IShellLink for the IPersistFile interface, used for saving the 
        // shortcut in persistent storage. 
        hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);

        if (SUCCEEDED(hres)) {
            // Save the link by calling IPersistFile::Save. 
            hres = ppf->Save(lpszPathLink, TRUE);
            ppf->Release();
        }
        psl->Release();
    }
    return hres;
}

正如我在评论中指定的那样,我构建了代码(以前的版本(问题 @VERSION #2.)回答时的那个 - BTW 包含一些字符串转换,这些转换很可能在非英语语言环境中失败)使用 VStudio 2013 和 运行 它在我的 Win 10(英文)机器上。它创建了一个有效的快捷方式。

因此,代码没有任何问题(从某种意义上说它不起作用)。
问题是输出文件也有 .png 扩展名,打开它时,Win 会尝试使用默认图像查看器/编辑器,会将文件视为 PNG(基于其扩展名)。
这显然是错误的,因为 .lnk 文件有自己的格式(正如我在 中简要解释的那样)。

解决方案是 正确命名 快捷方式(让它具有 .lnk 扩展名)。

关于代码(当前状态)的一些附加(非关键)注释:

  • 不需要 C++ (11) 功能(nullptr(另请检查下一个项目符号)):

    HRESULT hCoInit = CoInitialize(NULL);
    
  • 重组 #include。使用以下列表:

    #include <windows.h>
    #include <shobjidl.h>
    #include <shlguid.h>
    #include <stdio.h>