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++ でコンパイルされることが多く、言語間の区別はしばしばあいまいです。

2番目の問題は、前に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;
}
于 2016-01-30T14:57:18.477 に答える