【问题标题】:Get thumbnail of any file including SolidWorks on Windows XP/Vista在 Windows XP/Vista 上获取包括 SolidWorks 在内的任何文件的缩略图
【发布时间】:2017-08-17 12:55:26
【问题描述】:

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

但是有没有办法获得这些缩略图?我尝试使用 Windows API CodecPack 来管理它,但我只在 Windows 7 上成功了。

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

问题是:在 Windows XP/Vista 上,是否有任何其他可用的方法可以通过注册的缩略图提供程序获取任何文件的缩略图?我真的很绝望……

【问题讨论】:

    标签: c# .net api thumbnails solidworks


    【解决方案1】:

    有几种方法:

    1) 带有库OpenMCDF。 Solidworks 文件为 Compound document,因此访问其内容 - 正在解析文件。

     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 告诉我它不是图像???
    • 我指的是solidworks的例子,所以应该可以。如果你得到的是solidworks文件的图片,成员名必须是“PreviewPNG”,而不是“Preview”。
    • 试过openMCDF,没用。然后尝试了swdocumentmgr。在很难找到 stdole 和 microsoft.visualbasic.compatibility dll 之后,它也无法正常工作。它在“GetPreviewPNGBitmap”上失败,说该类没有使用许可证。
    【解决方案2】:

    您可以使用非托管的 windows shell 方法来获取缩略图

    Here is the code (not a small one)

    但结果远非完美。

    • 调试非常困难,未指明的错误很常见
    • 目标机器上必须有可用的特定文件阅读器(例如,用于 pdf 的 pdf-reader,未在 SolidWorks 上尝试过)
    • 只能在 Windows 中工作
    • 性能问题
    • 缩略图质量低(用 pdf 试过)

    【讨论】:

      猜你喜欢
      • 2017-08-25
      • 1970-01-01
      • 2011-06-14
      • 2010-09-25
      • 2011-03-08
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多