在Windows XP/Vista上获取任何文件的缩略图,包括SolidWorks

8

每个安装的操作系统中都有许多内置的缩略图提供程序。由于这些提供程序,Windows 能够显示许多文件的缩略图。例如,Windows Explorer 可以显示 *.jpg 文件的内容,但也可以显示 Solidworks 的 *.sldprt 文件的内容(如果安装了 SolidWorks)。

但是是否有任何方法可以获取这些缩略图呢?我尝试使用 Windows API CodecPack 进行管理,但只在 Windows 7 上成功了。

ShellFile shellFile = ShellFile.FromFilePath(filePath);                
Bitmap shellThumb = shellFile.Thumbnail.Bitmap;

问题是:除了在Windows XP/Vista上注册的缩略图提供程序之外,是否还有其他可用的方法来获取任何文件的缩略图?我真的很绝望...
2个回答

5

有几种方法:

1)使用库OpenMCDF。Solidworks文件是复合文档,因此访问其内容需要解析文件。

 OpenFileDialog dialog = new OpenFileDialog();    
 dialog.InitialDirectory = Application.StartupPath;  
 if (dialog.ShowDialog() == DialogResult.OK)  
 {  
     string STORAGE_NAME = dialog.FileName.ToString();  
     CompoundFile cf = new CompoundFile(STORAGE_NAME);  
     CFStream st = cf.RootStorage.GetStream("PreviewPNG");  
     byte[] buffer = st.GetData();  
     var ms = new MemoryStream(buffer.ToArray());  
     pictureBox1.Image = Image.FromStream(ms);  
  }  

2) 需要将EModelView.dll库添加为控件并放置到表单中。

    OpenFileDialog dialog = new OpenFileDialog();
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            axEModelViewControl1.OpenDoc(dialog.FileName.ToString(), false, false, true, "");
        }

3) 使用SWExplorer库(wpfPreviewFlowControl)

        OpenFileDialog dialog = new OpenFileDialog();
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            string sDocFileName = dialog.FileName.ToString();
            wpfThumbnailCreator pvf;
            pvf = new wpfThumbnailCreator();
            System.Drawing.Size size = new Size();
            size.Width = 200;
            size.Height = 200;
            pvf.DesiredSize = size;
            System.Drawing.Bitmap pic = pvf.GetThumbNail(sDocFileName);
            pictureBox1.Image = pic;
        }

3) 使用文档管理器库 (SolidWorks.Interop.swdocumentmgr)

         OpenFileDialog dialog = new OpenFileDialog();
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            string sDocFileName = dialog.FileName.ToString();
            SwDMClassFactory swClassFact = default(SwDMClassFactory);
            SwDMApplication swDocMgr = default(SwDMApplication);
            SwDMDocument swDoc = default(SwDMDocument);
            SwDMConfigurationMgr swCfgMgr = default(SwDMConfigurationMgr);
            string[] vCfgNameArr = null;
            SwDMConfiguration7 swCfg = default(SwDMConfiguration7);
            IPictureDisp pPreview = default(IPictureDisp);
            SwDmDocumentType nDocType = 0;
            SwDmDocumentOpenError nRetVal = 0;
            SwDmPreviewError nRetVal2 = 0;
            Image image = default(Image);

            //Access to interface
            swClassFact = new SwDMClassFactory();
            swDocMgr = (SwDMApplication)swClassFact.GetApplication("Post your code here");
            swDoc = (SwDMDocument)swDocMgr.GetDocument(sDocFileName, nDocType, false, out nRetVal);
            Debug.Assert(SwDmDocumentOpenError.swDmDocumentOpenErrorNone == nRetVal);
            swCfgMgr = swDoc.ConfigurationManager;

            pathLabel.Text = "Path to file: " + swDoc.FullName;
            configLabel.Text = "Active config: " + swCfgMgr.GetActiveConfigurationName();
            vCfgNameArr = (string[])swCfgMgr.GetConfigurationNames();

            foreach (string vCfgName in vCfgNameArr)
            {
                //get preview
                swCfg = (SwDMConfiguration7)swCfgMgr.GetConfigurationByName(vCfgName);
                pPreview = (IPictureDisp)swCfg.GetPreviewPNGBitmap(out nRetVal2);
                image = Support.IPictureDispToImage(pPreview);
                //insert to picturebox
                pictureBox1.BackgroundImage = image;
            }
            swDoc.CloseDoc();
        }

openMCDF示例无法正常工作。有一个“预览”元素,但是.NET告诉我它不是图像? - jimconstable
我指向了Solidworks的例子,所以应该可以工作。 如果你得到一个Solidworks文件的图片,成员名称必须是“PreviewPNG”,而不是“Preview”。 - streamdown
尝试了 openMCDF,但是没有起作用。然后尝试了 swdocumentmgr。在艰难地找到 stdole 和 microsoft.visualbasic.compatibility dll 文件之后,它也没有起作用。它在 "GetPreviewPNGBitmap" 处失败,称该类没有使用许可证。 - AXMIM

-1

您可以使用未管理的Windows shell方法来获取缩略图

这里是代码(不是很小)

但结果远非完美。

  • 调试非常困难,常见未指定错误
  • 目标机器上必须有特定的文件阅读器可用(例如pdf阅读器用于pdf文件,在SolidWorks上没有尝试过)
  • 仅适用于Windows
  • 性能问题
  • 缩略图质量低(使用pdf测试过)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接