无法使 SHGetKnownFolderPath() 函数正常工作
Cannot get SHGetKnownFolderPath() function working
我在使用 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;
}
如何修复此错误消息?
EDIT 我找到了 SHGetKnownFolderPath() 的代码示例;所有的
他们在没有指针的情况下执行函数。例如:
hr = SHGetKnownFolderPath(FOLDERID_Public, 0, NULL, &pszPath);
if (SUCCEEDED(hr))
{
wprintf(L"FOLDERID_Public: %s\n", pszPath);
CoTaskMemFree(pszPath);
}
在 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++ 一起编译,并且有区别
语言之间往往是模糊的。
第二个问题,在#include <ShlObj.h>
之前添加#include <initguid.h>
修复了Unresolved external symbol 'FOLDERID_ProgramFiles'. error.
错误。原因在这个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;
}
这有助于理解变量 FOLDERID_Documents 实际上是一个 GUID 结构:它在 GuidDef.h header.
中定义
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 ;
}
我在使用 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;
}
如何修复此错误消息?
EDIT 我找到了 SHGetKnownFolderPath() 的代码示例;所有的 他们在没有指针的情况下执行函数。例如:
hr = SHGetKnownFolderPath(FOLDERID_Public, 0, NULL, &pszPath);
if (SUCCEEDED(hr))
{
wprintf(L"FOLDERID_Public: %s\n", pszPath);
CoTaskMemFree(pszPath);
}
在 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++ 一起编译,并且有区别
语言之间往往是模糊的。
第二个问题,在#include <ShlObj.h>
之前添加#include <initguid.h>
修复了Unresolved external symbol 'FOLDERID_ProgramFiles'. error.
错误。原因在这个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;
}
这有助于理解变量 FOLDERID_Documents 实际上是一个 GUID 结构:它在 GuidDef.h header.
中定义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 ;
}