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

Jan Bodnar |

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

Jan Bodnar |

在乔纳森·波特的评论的帮助下,我得以纠正该示例。

这个问题非常微妙。以下代码行看起来像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 ++编译的,而语言之间的区别通常是模糊的。

第二个问题,Unresolved 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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章