Microsoft.Office.Interop.PowerPoint.dll PowerPoint CustomDocumentProperties大问题

时间:2010-07-21 19:01:28

标签: c# interop powerpoint

我有可以将幻灯片导出到PowerPoint的应用程序。我正在使用Microsoft.Office.Interop.PowerPoint.dll。这是装配的第11版。我今天运行了应用程序,似乎应用程序抛出异常(来自HRESULT的异常:0x80070057(E_INVALIDARG))。它只会在我点击导出按钮之前在系统中打开powerpoint应用程序时抛出此异常。我正在向Powerpoint演示文稿的CustomDocumentProperties添加自定义属性,以便识别应用程序创建的演示文稿。这是我第一次看到这个例外。我有Windows 7 Ultimate x64系统与visual studio 2008和2010,当然还有Office 2007。

导致异常的代码部分:

oDocAuthorProp = typeDocBuiltInProps.InvokeMember("Item",
                                                   BindingFlags.Default |
                                                   BindingFlags.GetProperty,
                                                   null, oDocBuiltInProps,
                                                   new object[] { strIndex });

怎么了? 我遵循了Microsoft的这篇文章:http://support.microsoft.com/kb/303296

一年多来,应用程序一直没有任何问题。出了什么问题?花了10个小时在互联网上寻找我放弃的答案。

这是Export2Powerpoint方法的代码:

public static void Export(List<ChartObject> chartObjects)

{
    Application ppApp = new Application();


    foreach (ChartObject chartObject in chartObjects)
    {
        chartObject.Chart.BorderLineStyle = ChartDashStyle.NotSet;
    }

    Presentation ppPress = null;

    int i;
    object oDocBuiltInProps;

    string strValue = string.Empty;

    if(ppApp.Presentations.Count == 0)
    {
        ppPress = AddPresentation(ppApp, ppPress);
    }
    else
    {
        i = 0;


        object oDocAuthorProp = null;

        foreach (Presentation presentation in ppApp.Presentations)
        {
            oDocBuiltInProps = presentation.CustomDocumentProperties;
            Type typeDocBuiltInProps = oDocBuiltInProps.GetType();

            string strIndex = "Browser";


            try{


                oDocAuthorProp = typeDocBuiltInProps.InvokeMember("Item",
                                           BindingFlags.Default |
                                           BindingFlags.GetProperty,
                                           null, oDocBuiltInProps,
                                           new object[] { strIndex }); ======>> here is the line that generates the exception
            }
            catch(Exception e)
            {
                //ErrorHandling.LogErrorToFile(e.Message, e.StackTrace);
            }
            if (oDocAuthorProp != null)
            {
                Type typeDocAuthorProp = oDocAuthorProp.GetType();
                strValue = typeDocAuthorProp.InvokeMember("Value",
                                                          BindingFlags.Default |
                                                          BindingFlags.GetProperty,
                                                          null, oDocAuthorProp,
                                                          new object[] {}).ToString();
            }

            i++;

            if(strValue == "true")
            {
                break;
            }                       
        }

        if (strValue != string.Empty)
        {
            ppPress = ppApp.Presentations[i];
        }
        else
        {
            ppPress = AddPresentation(ppApp, ppPress);
        }
    }

    i = ppPress.Slides.Count + 1;

    int j = 0;

    chartObjects.Reverse();
    chartObjects.ForEach(chartObject =>
    {
         string directory = Path.Combine(System.Windows.Forms.Application.StartupPath, (i) + ".png");
         PowerPoint.Slide actSlide = ppPress.Slides.Add(i, PpSlideLayout.ppLayoutBlank);
         actSlide = ppPress.Slides[i];
         Size size = chartObject.Chart.Size;

         chartObject.Chart.ChartAreas[0].AxisX.LabelsAutoFitMinFontSize = 14;

         chartObject.Chart.Size = new Size(RunTime.Configuration.ImageXSize,RunTime.Configuration.ImageYSize);

         chartObject.Chart.SaveAsImage(directory, ChartImageFormat.Png);
         chartObject.Chart.Size = size;
         Image image = Image.FromFile(directory);
         actSlide.Shapes.AddPicture(directory, MsoTriState.msoFalse,
                  MsoTriState.msoTrue, 0, 0, (int)ppPress.SlideMaster.Width, (int)ppPress.SlideMaster.Height);

         image.Dispose();
         File.Delete(directory);
         j++;
    });

    chartObjects.Reverse();

    ppApp.Visible = MsoTriState.msoTrue;

    foreach (ChartObject chartObject in chartObjects)
    {
        chartObject.Chart.BorderLineStyle = ChartDashStyle.Solid;
    }
}

编辑: 只有当打开至少一个powerpoint窗口并且该窗口中的演示文稿尚未保存到磁盘时,才会抛出此类异常。当打开至少一个带有演示文稿的powerpoint窗口已保存到磁盘时,应用程序运行正常。

1 个答案:

答案 0 :(得分:1)

当我使用嵌入式字体时,我遇到了我怀疑可能是类似的问题(当时,代码上无法解释的例外,但我们确实跟踪了它)。事实证明,这是一个无法解决的,不可见的对话框阻止了应用程序,互操作库变成了一个例外。本质上,我们的经验是,PowerPoint应用程序的许多功能对于互操作类不可用,如果在正常操作中达到它们,则互操作代码会挂起或中断(通常会中断)。所以,在我们的例子中,没有互操作标志允许使用嵌入字体(在PowerPoint应用程序中,当文件嵌入字体时,它强制提示(你想以只读模式打开它,还是根本不打开) ?))必须回答,并且由于互操作库中没有能力指定您的选择,互操作调用会抛出异常。所以,我的猜测是这里有一些东西,互操作库无法回答PowerPoint应用程序提出的“阻塞”问题。

当然,我们遇到此问题的最常见原因都是由Windows Update提供Office更新引起的,这些更新更新了PowerPoint的安全默认值。您可能想先检查一下。

如果您要在普通的PowerPoint应用程序窗口中执行相同的操作(将该字段更改为“浏览器”,我认为您似乎正在执行此操作),在尚未保存的演示文稿中,它是否会呈现给您用对话框?