- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在使用 SHGetKnownFolderPath() 函数时遇到问题。我收到以下错误消息:“SHGetKnownFolderPath”参数 1 中的类型错误;应为“const struct _GUID *”但找到了“struct _GUID”。
在KnowFolders.h
中我们有如下相关定义:
#define DEFINE_KNOWN_FOLDER(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
EXTERN_C const GUID name
...
DEFINE_KNOWN_FOLDER(FOLDERID_ProgramFiles,0x905e63b6,0xc1bf,0x494e,0xb2,0x9c,0x65,0xb7,0x32,0xd3,0xd2,0x1a);
我正在使用 Pelles C 编译器。
这是我的示例代码:
#include <windows.h>
#include <wchar.h>
#include <KnownFolders.h>
#include <shlobj.h>
int wmain(int argc, wchar_t **argv) {
PWSTR path = NULL;
HRESULT hr = SHGetKnownFolderPath(FOLDERID_ProgramFiles, 0, NULL, &path);
if (SUCCEEDED(hr)){
wprintf(L"%ls", path);
}
CoTaskMemFree(path);
return 0;
}
如何修复此错误消息?
编辑 我找到了 SHGetKnownFolderPath(); 的代码示例;所有的他们在没有指针的情况下执行函数。例如:
hr = SHGetKnownFolderPath(FOLDERID_Public, 0, NULL, &pszPath);
if (SUCCEEDED(hr))
{
wprintf(L"FOLDERID_Public: %s\n", pszPath);
CoTaskMemFree(pszPath);
}
最佳答案
在 Jonathan Potter 的评论的帮助下,我能够更正示例。
这个问题非常微妙。下面的代码行看起来像 C,但是它实际上是 C++。
HRESULT hr = SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &path);
SHGetKnownFolderPath()
函数具有以下原型(prototype):
STDAPI SHGetKnownFolderPath(REFKNOWNFOLDERID, DWORD, HANDLE, PWSTR*);
它的第一个参数是REFKNOWNFOLDERID
.
在shtypes.h
我们发现以下文件:
#ifdef __cplusplus
#define REFKNOWNFOLDERID const KNOWNFOLDERID &
#else
#define REFKNOWNFOLDERID const KNOWNFOLDERID * /*__MIDL_CONST*/
#endif /* __cplusplus */
这意味着,在 C++ 中 REFKNOWNFOLDERID
是一个引用,在 C 中它是一个指针。因此,我们不需要 C++ 中的符号第一个参数的代码。在 Visual C++ 中,C 代码通常与 C++ 一起编译,并且有区别语言之间往往是模糊的。
第二期,Unresolved external symbol 'FOLDERID_ProgramFiles'. error.
通过添加 #include <initguid.h>
修复错误之前 #include <ShlObj.h>
. article中解释了原因.
所以下面的代码可以在 Pelles C 上编译。
#include <windows.h>
#include <initguid.h>
#include <KnownFolders.h>
#include <ShlObj.h>
#include <wchar.h>
int wmain(void) {
PWSTR path = NULL;
HRESULT hr = SHGetKnownFolderPath(&FOLDERID_Documents, 0, NULL, &path);
if (SUCCEEDED(hr)) {
wprintf(L"%ls\n", path);
}
CoTaskMemFree(path);
return 0;
}
关于c++ - 无法使 SHGetKnownFolderPath() 函数正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35042967/
我正在尝试使用 Visual Studio 2008 从 C 调用 Vista 函数 SHGetKnownFolderPath()。该代码可以像 C++ 一样正常工作,但拒绝使用以下输出编译为 C 代
我在使用 SHGetKnownFolderPath() 函数时遇到问题。我收到以下错误消息:“SHGetKnownFolderPath”参数 1 中的类型错误;应为“const struct _GUI
我使用下面的代码获取 appdata 文件夹。通常它可以工作,但是如果我使用与 this 类似的方式通过服务启动相同的进程我收到错误 0x80070005,这意味着 Access Denied。 HR
我正在使用 visual studio 2013 并编译一些东西以在 Windows XP 上运行它。它在我的 Windows 10 机器上运行良好,但是当我在 XP 下启动时出现错误: the pr
我正在 Windows 10 上使用 Visual Studio 2015 编写 Windows 应用商店应用程序。我的代码如下: #define WINVER 0x0A00 #define _WIN
我目前正在向现有的 Vb6 项目添加 Windows 7 支持,但在使用 SHGetFolderPath 定位特殊文件夹路径时遇到了问题,从 Vista 开始的 Windows 版本不支持该路径。我知
我正在尝试使用函数 SHGetKnownFolderPath() 获取用户本地应用程序数据的目录并将 PWSTR(这是一个 wchar_t*)转换为 LPCSTR(这是一个 const char*),
我正在将一些功能从 Windows 移植到 Linux,但我发现很难与 Linux 中的 SHGetKnownFolderPath 的功能相匹配。实际上 glib 中有一个 API 可以处理这部分,但
我使用下面的代码通过 SHGetKnowFolderPath() 获取 ProgramData 路径。 你能告诉我将它与 CString 一起使用是否正确吗?如果不是,使用 SHGetKnownFol
我的软件仍然需要支持 Windows XP。在里面我调用SHGetKnownFolderPath来自 Windows 服务的 API,用于通过 hToken 获取用户特定的路径(例如 FOLDERID
我在尝试解析 CommonDocuments 目录时遇到了一个有点奇怪的错误。在使用 Windows 资源管理器(属性 -> 上下文菜单中的路径)将 CommonDocuments 目录重定向/移动到
我正在为 Windows 7 及更高版本编写 C++ 桌面应用程序。 我想获取 AppData/Roaming 文件夹的路径,所以我使用 SHGetKnownFolderPath : #include
(Visual Studio 2010/Visual C++/Windows 7) 例子.cpp: #include #pragma comment (lib, "Shell32.lib")
我是一名优秀的程序员,十分优秀!