打开第二个演示文稿失败-Delphi XE2+;视窗8

打开第二个演示文稿失败-Delphi XE2+;视窗8,delphi,powerpoint,Delphi,Powerpoint,需要打开PowerPoint演示文稿。我使用下面的语句 变量 ppt:_应用程序; pres:_演示 try ppt := GetActiveOleObject('PowerPoint.Application') as _Application; except ppt := CreateOleObject('PowerPoint.Application') as _Application ; end;

需要打开PowerPoint演示文稿。我使用下面的语句

变量 ppt:_应用程序; pres:_演示

        try
            ppt := GetActiveOleObject('PowerPoint.Application') as _Application;
        except
            ppt := CreateOleObject('PowerPoint.Application') as _Application ;
        end;

       ppt.Visible := msoTrue;

        try
           pres := ppt.Presentations.Open(FPOTX, msoFalse, msoTrue, msoTrue);
        except
        on e:exception do begin
           printtofile('Error in call to ppt.Presentation.Open' + e.message);
           end;
        end;
无论何时调用exception中的CreateOleObject(),它都可以正常工作。(即,尚未打开任何演示文稿)

但是,如果一个演示文稿已经打开,则上述语句将失败。(即,在GetActiveOleObject()函数之后调用ppt.Presentations.Open()

使用Delphi XE2、MS Office 2013、Windows 8

这仅在Windows 8中失败,而在Windows 7中不失败。
提前谢谢。

我不知道问题出在哪里,是您的Delphi版、Office版还是Windows版。但该代码在Windows8.1x64、DelphiXe2(32位目标)、Office2007中运行没有问题。不幸的是,我没有Office 2013来测试它

我的Delphi中没有导入任何类型库。所以我只使用普通的
Variant
类型来测试它

如果PPT未打开,代码将打开它。否则它将获取OLE对象。然后打开所需的演示文稿。无论PPT是关闭还是打开,只要我测试它,它就可以正常工作

...

implementation

uses
    ComObj, ActiveX;

const
    msoFalse = TOleEnum(False);
    msoTrue = TOleEnum(True);

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
    ppt, pres: Variant;
begin
    ppt := Unassigned;
    pres := Unassigned;
    try
        ppt := GetActiveOleObject('PowerPoint.Application');
    except
        ppt := CreateOleObject('PowerPoint.Application');
    end;

    ppt.Visible := msoTrue;
    try
        pres := ppt.Presentations.Open('C:\Temp\Test.pptx', msoFalse, msoTrue, msoTrue);
    except
        on E:Exception do
            ShowMessage('OOPS');
    end;
end;
编辑

我还使用导入的PowerPoint类型库对其进行了测试。您的代码在这里是1:1:

...

implementation

uses
    ComObj, ActiveX, PowerPoint_TLB;

const
    msoFalse = TOleEnum(False);
    msoTrue = TOleEnum(True);

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
    ppt: _Application;
    pres: _Presentation;
begin
    ppt := nil;
    pres := nil;
    try
        ppt := GetActiveOleObject('PowerPoint.Application') as _Application;
    except
        ppt := CreateOleObject('PowerPoint.Application') as _Application;
    end;

    ppt.Visible := msoTrue;
    try
        pres := ppt.Presentations.Open('C:\Temp\Test.pptx', msoFalse, msoTrue,    msoTrue);
    except
        on E:Exception do
            ShowMessage('OOPS');
    end;
end;
OFFICE 2013解决方案


正如您已经发现的那样:当更改
ppt.Presentations的
Title
参数时,它似乎与
Office 2013
一起工作。打开
msoFalse
==>
ppt.Presentations.Open(FPOTX,msoFalse,msoFalse,msoTrue)
这对我来说绝对没有任何问题。面临的问题是XXX.pot(Office1997-2003)和XXX.potx(office2014)之间的兼容性问题。除此之外,一切正常。

-1“失败”不是一个好的问题描述。这个问题似乎很熟悉。看起来您删除了以前的版本并再次询问。这不是它真正的工作原理。至少,如果你想再问一次,请不要让我们像上次一样,再次完成所有问题的改进。因此,请不要让我们再次从您身上拖出错误消息等。我们已经做过一次了。“我们为什么还要再做一次?”大卫,你可能是说…@特拉玛是的,就是那个。不知什么原因,我找不到它。而且我不能投票决定以被骗者的身份关闭(因为它是由另一个用户要求的)。因此,在有人给其中一个写答案之前,提问者可以不断创建新帐户并提出新问题。谢谢你的回复。在这里,我必须使用ppt作为应用程序类型,而pres作为演示类型,而不是变体(如您所建议的)。你能告诉我这附近的工作吗。因为,在我的应用程序中,应用程序、演示文稿、幻灯片用于打开演示文稿中的每张幻灯片并在每张幻灯片上书写。由于这是我的应用程序中的现有代码,我无法按照您的建议进行更改。大家好,将标题参数更改为msofalse解决了Win8中的问题。i、 打开(FPOTX,msoFalse,msoFalse,msoTrue)我刚刚再次测试了它,但是使用了导入的PowerPoint_TLB单元和您第一篇文章中的初始代码,这里的效果也是1:1。但我很高兴你找到了适合你的解决方案。谢谢你把它贴在这里。我用你的解决方案更新了我的答案,这样搜索它的人会发现它更容易。你说的1:1是什么意思。我不明白?