4

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

4

2 回答 2

13

在 Jonathan Potter 评论的帮助下,我能够纠正这个例子。

这个问题非常微妙。以下代码行看起来像 C,但实际上是 C++。

HRESULT hr = SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &path);

SHGetKnownFolderPath()函数具有以下原型:

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++ 编译,并且语言之间的区别通常很模糊。

第二个问题,通过添加beforeUnresolved external symbol 'FOLDERID_ProgramFiles'. error.修复了错误。原因在这篇文章中有解释。#include <initguid.h>#include <ShlObj.h>

所以下面的代码在 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;
}
于 2016-01-30T14:57:18.477 回答
2

这将有助于理解变量 FOLDERID_Documents 实际上是一个 GUID 结构:它在 GuidDef.h 头文件中定义。

typedef struct {
unsigned long  Data1;
unsigned short Data2;
unsigned short Data3;
byte           Data4[ 8 ];
} GUID;

我也有这个问题。我认为这种混淆源于之前使用的 CSIDL,它们不是结构,而只是一种数字类型。如果 MSDN 文档显示了一个示例,它也会有所帮助。所以,我在这里包括一个:

    #include <windows.h>
    #include <KnownFolders.h>
    #include <shlobj.h>
    #include <stdio.h>

    int main (void)
    { 
        PWSTR path ;
        SHGetKnownFolderPath(&FOLDERID_Public, 0, NULL, &path) ;
        wprintf(L"%s\nSize of FOLDERID: %d bytes\n", path, sizeof(FOLDERID_Public)) ;
        wprintf(L"{%x-%hx-%hx-%x%x%x%x%x%x%x%x}\n", FOLDERID_Public.Data1, FOLDERID_Public.Data2, FOLDERID_Public.Data3, FOLDERID_Public.Data4[0], FOLDERID_Public.Data4[1], FOLDERID_Public.Data4[2], FOLDERID_Public.Data4[3], FOLDERID_Public.Data4[4], FOLDERID_Public.Data4[5], FOLDERID_Public.Data4[6], FOLDERID_Public.Data4[7]) ;
        CoTaskMemFree((LPVOID)path)  ;
        return 0 ;
    }
于 2018-10-25T03:06:54.037 回答