none
包含了#include <shlobj.h>,为什么还找不到SHBindToParent? RRS feed

答案

全部回复

  • 你还要包含lib文件才行,要么在cpp的头+上:

    #pragma comment ( lib, "Ceshell.lib" )

     

    要么在项目属性的Linker->Input->Additonal Dependencies里面添加Ceshell.lib,注意release和debug都要添加

    2008年9月8日 6:45
  • 谢谢bobcy的解答, 但是我已经在Linker->Input 里添加了Ceshell.lib,在Additonal Dependencies里包含了相应目录,可它还是找不到,不知道为什么 ?
    2008年9月8日 6:50
  • 确定debug版和release版都添加了lib吗?推荐你用第一种方式,在#include <shlobj.h>后加一句:

     

    #pragma comment ( lib, "Ceshell.lib" )

     

    如果还是错误的话,把整个错误说明完整的贴上来。

    2008年9月8日 6:55
  • 我的代码如下:
    #include <Shlobj.h>
    #include <shlwapi.h>

    #pragma comment ( lib, "Ceshell.lib" )

    bool file()
    {
         IMalloc * pShellMalloc = NULL;        // A pointer to the shell's IMalloc interface
        IShellFolder *psfParent;              // A pointer to the parent folder object's IShellFolder interface.
        LPITEMIDLIST pidlItem = NULL;         // The item's PIDL.
        LPITEMIDLIST pidlRelative = NULL;     // The item's PIDL relative to the parent folder.
        STRRET str;                           // The structure for strings returned from IShellFolder.
        WCHAR szDisplayName[MAX_STRING]= L"";   // The display name's string for Favorites
        WCHAR szPath[MAX_STRING] = L"";         // The path for Favorites.

        HRESULT hres = SHGetMalloc(&pShellMalloc);
        if (FAILED(hres))
        {
            return false;
        }
        hres = SHGetSpecialFolderLocation(NULL,
                                          CSIDL_FAVORITES,
                                          &pidlItem);
        if (SUCCEEDED(hres))
        {
            hres = SHBindToParent(pidlItem,
                IID_IShellFolder,
                (void**)&psfParent,
                (LPCITEMIDLIST*)&pidlRelative);
            if (SUCCEEDED(hres))
            {
                // Retrieve the display name
                memset(&str, 0, sizeof(str));
                hres = psfParent->GetDisplayNameOf(pidlRelative, SHGDN_NORMAL, &str);
                if (SUCCEEDED(hres))
                {
                    StrRetToBuf(&str, pidlItem, szDisplayName, sizeof(szDisplayName));
                }
                // Retrieve the path
                memset(&str, 0, sizeof(str));
                hres = psfParent->GetDisplayNameOf(pidlRelative, SHGDN_NORMAL | SHGDN_FORPARSING, &str);
                if (SUCCEEDED(hres))
                {
                    StrRetToBuf(&str, pidlItem, szPath, sizeof(szPath));
                }
                psfParent->Release();
            }
        }

        // Clean up allocated memory
        if (pidlItem)
        {
            pShellMalloc->Free(pidlItem);
        }
        if (pidlRelative)
        {
            pShellMalloc->Free(pidlRelative);
        }
        pShellMalloc->Release();
     
    }


    以上主体是MSDN里的例子

    错误为:
    Error    2    error C3861: 'SHBindToParent': identifier not found 

    2008年9月8日 7:01
  • 补充一下,我用的是IDE是VS2005,语言是c++
    2008年9月8日 7:05
  • MSDN上的资料是:

    Requirements

    OS Versions: Windows CE .NET 4.2 and later.
    Header: Shlobj.h.
    Link Library: Ceshell.lib.

     

    可能是这个API只能在WinCE 4.2或者更高版本的WInCE下使用,我搜索了WM 5/6 SDK PPC/SP的系统库头文件,都找不到SHBindToParent()的定义。我手头没有WinCE的SDK,帮不到你了。

    2008年9月8日 7:34
  • 非常感谢bobcy的解答,很有可能它只能在WinCE下使用。
    2008年9月8日 7:40
  • SHBindToParent

    仅在Windows Embedded CE下可以使用,你可以在PB中找到它.

    MSDN:

    http://msdn.microsoft.com/en-us/library/aa932728.aspx

     

     

    2008年9月8日 12:43
    版主
  • 谢谢fox23!
    2008年9月9日 7:01