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>
我想创建一个文件的快捷方式。我发现 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>