我想创建文件的快捷方式。我发现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;
}
答案 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>