文件预览可对所有在资源管理器中能够进行图像预览的文件进行预览,而不仅仅只是图片文件。如网页文件,甚至是CAD文件,像作者在进行UG二次开发时就使用了本文所使用的方法预览UG的part文件。
关于怎么定制通用对话框已经有很多文章讲了,这里就不讲了,我这里主要讲的是如何从文件中提取出它的预览图像。
对于文件预览图的提取,系统提供了一个Shell接口,IExtractImage,通过它的Extract方法就可以取出预览图的位图句柄。而IExtractImage接口可以通过IShellFolder接口的GetUIObect方法获得。这个IShellFolder是文件所在文件夹的IShellFolder。要取得任意文件夹的IShellFolder,必须从桌面的IShellFolder开始一级一级的往下找,因为取得IShellFolder需要从其父IShellFolder的BindToObject得到,在其中使用相对的PIDL。整个操作都是以PIDL为基础的,这个PIDL就是外壳命名空间的对象的ID,关于外壳命名空间及项目ID的解释见我的另一篇翻译《外壳命名空间》。下面给出几个有用的函数:
// 从文件的全路径得到它的绝对PIDL
LPITEMIDLIST ParsePidlFromPath(LPCSTR lpszPath)
{
//存放以Unicode内码表示的路径字符串的缓冲区
OLECHAR szOleChar[MAX_PATH];
//“桌面“的IshellFolder接口指针
LPSHELLFOLDER lpsfDeskTop;
//返回的PIDL
LPITEMIDLIST lpifq;
ULONG ulEaten, ulAttribs;
HRESULT hres;
//得到“桌面”的IshellFolderr 接口指针
SHGetDesktopFol