我在使用 SHGetKnownFolderPath() 函数时遇到了麻烦。
我收到以下错误消息:Type error in argument 1 to 'SHGetKnownFolderPath'; expected 'const struct _GUID *' but found '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

最佳答案

在乔纳森·波特的评论的帮助下,我能够
纠正这个例子。

这个问题非常微妙。下面的代码行看起来像 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/

10-10 16:19