gpt4 book ai didi

c++ - 无法使 SHGetKnownFolderPath() 函数正常工作

转载 作者:搜寻专家 更新时间:2023-10-30 23:54:48 25 4
gpt4 key购买 nike

我在使用 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);
}

CppShellKnownFolders.cpp

最佳答案

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com