Не удается заставить работать функцию SHGetKnownFolderPath ()

У меня проблемы с использованием функции 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

2

Решение

С помощью комментариев Джонатана Поттера я смог
исправьте пример.

Проблема была очень тонкой. Следующая строка кода выглядит как 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 ++
код для первого параметра.
В 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;
}
5

Другие решения

Было бы полезно понять, что переменная 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 ;
}
1

По вопросам рекламы [email protected]