Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法使SHGetKnownFolderPath()函数工作_C++_C_Winapi_Pelles C - Fatal编程技术网

C++ 无法使SHGetKnownFolderPath()函数工作

C++ 无法使SHGetKnownFolderPath()函数工作,c++,c,winapi,pelles-c,C++,C,Winapi,Pelles C,我在使用SHGetKnownFolderPath()函数时遇到问题。 我收到以下错误消息: 参数1中的'SHGetKnownFolderPath'类型错误;应为“const struct\u GUID*”,但找到了“struct\u GUID”。 在KnowFolders.h中,我们有以下相关定义: #define DEFINE_KNOWN_FOLDER(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \ EXTERN_C const GUID name ..

我在使用SHGetKnownFolderPath()函数时遇到问题。 我收到以下错误消息:
参数1中的'SHGetKnownFolderPath'类型错误;应为“const struct\u GUID*”,但找到了“struct\u 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;
}

在乔纳森·波特评论的帮助下,我能够 纠正这个例子

问题很微妙。下面的代码行看起来像C,但是 它实际上是C++。p>
HRESULT hr=SHGetKnownFolderPath(FOLDERID\u文档,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++<代码>中,ReNeXNoFLDIDID 是一个引用,在C++中 这是一个指针。因此,我们不需要在C++中使用 第一个参数的代码。 在Visual C++中,代码经常用C++编译,并加以区别 两种语言之间常常模糊不清

第二个问题是,
未解析的外部符号“FOLDERID\u ProgramFiles”。错误。
通过在
\include
之前添加
\include
来修复错误。原因就在这里

下面的代码在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;
}
#包括
#包括
#包括
#包括
#包括
int wmain(无效){
pwstrpath=NULL;
HRESULT hr=SHGetKnownFolderPath(&FOLDERID\u文档,0,NULL,&path);
如果(成功(hr)){
wprintf(L“%ls\n”,路径);
}
CoTaskMemFree(路径);
返回0;
}

了解变量FOLDERID\u 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 ;
    }
#包括
#包括
#包括
#包括
内部主(空)
{ 
PWSTR通路;
SHGetKnownFolderPath(&FOLDERID_Public,0,NULL,&path);
wprintf(L“%s\n文件夹ID大小:%d字节\n”、路径、大小(文件夹ID_Public));
wprintf(L“{%x-%hx-%hx-%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[5],FOLDERID_Public.Data4[6],FOLDERID_Public.Data4];
CoTaskMemFree((LPVOID)路径);
返回0;
}

它需要一个指向GUID的指针,所以给它传递一个指针<代码>SHGetKnownFolderPath(&FOLDERID\u程序文件,…)错误消息非常清楚。它说:在参数1中输入错误到'SHGetKnownFolderPath';应为“const struct\u GUID*”,但找到的“struct\u GUID”无法再清楚显示。我假定您理解类型不匹配的概念?在包含
shlobj.h
之前,您至少需要一个定义
INITGUID
的编译单元。请参阅以获取解释。请注意,所有的示例都是基于VisualC++的,而不是使用的编译器。顺便说一下,如果修复编译器错误,那么会导致链接错误,这并不意味着编译器错误的修复是错误的。这意味着你有两个错误,一个也奇怪为什么你要问你的问题C++。这是两种不同的语言。你在C和C++中编译代码吗?如果可以的话。如果没有,请选择一种您正在使用的语言。
    #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 ;
    }