我做了一个显示某些确定的系统位置PIDL的程序。
调试环境:2000 pro/server;
工具:vc++60.
工程:win32 控制台。
其中我在 工程->设置->link下的对象/库模块中的连接库如下:
kernel32.lib user32.lib gdi32.lib Shell32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib 
也就是在通用的上面加了一个Shell32.lib
代码如下:
#define _WIN32_WINNT 0x0500
#define WINVER 0x0500
#include <windows.h>
#include <iostream.h>
#include <Shlobj.h>
//显示内存块辅助程序的方法
void ShowBlock(LPCTSTR pbStart,size_t nCount)
{
cout<<"data:";
for(int nShow=0;nShow<nCount;++nShow)
{
TCHAR chShow=pbStart[nShow];
cout<<(isprint(chShow) ? chShow : '.');
}
cout<<endl;
}
//显示ID列表中的每一项的辅助程序的方法
void ShowItems(LPCITEMIDLIST pidl)
{
int nCount(0);
const SHITEMID * pID=reinterpret_cast<const SHITEMID *>(pidl);
while(pID->cb>0)
{
int nItemSize=pID->cb;
cout<<"\tITEM #"<<++nCount
<<" size :"<<nItemSize;
::ShowBlock(reinterpret_cast<LPCTSTR>(pID->abID),nItemSize);
pID=reinterpret_cast<const SHITEMID *>(reinterpret_cast<const BYTE*>(pID)+nItemSize); }
}
//向用户显示PIDL的辅助方法
void ShowPidl(LPCITEMIDLIST pidl)
{
ULONG nSize(0);
IMalloc * pMalloc=NULL;
if(SUCCEEDED(::SHGetMalloc(&pMalloc)))
{
nSize=pMalloc->GetSize((void *)pidl);
pMalloc->Release();
pMalloc=NULL;
}
cout<<"PIDL size:"<<nSize<<endl;
::ShowItems(pidl);
}
//显示经过的CSIDL的PIDL
void ShowCSIDL(int CSIDL)
{
LPITEMIDLIST pidl=NULL;
if(SUCCEEDED(::SHGetFolderLocation(NULL,CSIDL,NULL,0,&pidl)))
{
::ShowPidl(pidl);
IMalloc * pMalloc=NULL;
::SHGetMalloc(&pMalloc);
pMalloc->Free(pidl);
pidl=NULL;
pMalloc->Release();
pMalloc=NULL;
}}
void main()
{
cout<<"system folder :";
::ShowCSIDL(CSIDL_SYSTEM);
cout<<"Program files:";
::ShowCSIDL(CSIDL_PRAGRAM_FILES);
cout<<"Recycle bin:";
::ShowCSIDL(CSIDL_BITBUCKET);
cout<<"Internet cashe:";
::ShowCSIDL(CSIDL_INTERENT_CASHE);
}调试错误信息如下:
-------------------Configuration: viewpidl - Win32 Debug--------------------
Compiling...
viewpidl.cpp
g:\pidl\viewpidl\viewpidl.cpp(9) : warning C4018: '<' : signed/unsigned mismatch
g:\pidl\viewpidl\viewpidl.cpp(46) : error C2039: 'SHGetFolderLocation' : is not a member of '`global namespace''
g:\pidl\viewpidl\viewpidl.cpp(46) : error C2065: 'SHGetFolderLocation' : undeclared identifier
g:\pidl\viewpidl\viewpidl.cpp(61) : error C2065: 'CSIDL_SYSTEM' : undeclared identifier
g:\pidl\viewpidl\viewpidl.cpp(63) : error C2065: 'CSIDL_PRAGRAM_FILES' : undeclared identifier
g:\pidl\viewpidl\viewpidl.cpp(67) : error C2065: 'CSIDL_INTERENT_CASHE' : undeclared identifier
Error executing cl.exe.viewpidl.obj - 5 error(s), 1 warning(s)