winapi创建快捷方式失败

时间:2018-08-28 08:31:49

标签: c winapi visual-studio-2012 shortcut

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

当我调试它时,它在此行上显示“信息不可用,没有为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;
}

1 个答案:

答案 0 :(得分:2)

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

因此,代码没有任何错误(从某种意义上说,它是行不通的)。
问题是输出文件也具有 .png 扩展名,并且在打开文件时 Win 会尝试使用默认的图像查看器/编辑器,会将文件视为 PNG (基于扩展名)。
这显然是错误的,因为 .lnk 文件具有自己的格式(如我在[SO]: What is the internal structure of a Windows shortcut? (@CristiFati's answer)中所简要解释的那样)。

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

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

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

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

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