Jan*_*nar 2 c c++ winapi pelles-c
我在使用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);
Run Code Online (Sandbox Code Playgroud)
我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
如何修复此错误消息?
编辑我找到了SHGetKnownFolderPath()的代码示例; 所有这些都在没有指针的情况下执行函数.例如:
hr = SHGetKnownFolderPath(FOLDERID_Public, 0, NULL, &pszPath);
if (SUCCEEDED(hr))
{
wprintf(L"FOLDERID_Public: %s\n", pszPath);
CoTaskMemFree(pszPath);
}
Run Code Online (Sandbox Code Playgroud)
在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 */
Run Code Online (Sandbox Code Playgroud)
这意味着,在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;
}
Run Code Online (Sandbox Code Playgroud)