我在某些计算机上发生了一个问题(似乎是那些运行Office 365 1809版的计算机),但是我在其他计算机上运行了相同版本的365,并且使用完全相同的代码也可以。
>我需要以编程方式打开受密码保护的PowerPoint演示文稿。就其本身而言,与其他Office产品相比,仅打开受密码保护的PowerPoint演示文稿似乎更具挑战性,但经过一些试验和谷歌搜索问题之后,似乎可以使用此代码:
Dim ppt
MsgBox "booting ppt"
Set ppt = CreateObject("powerpoint.application")
ppt.Visible = True
Dim pvw
MsgBox "loading pvw"
Set pvw = ppt.ProtectedViewWindows.Open("C:\Files\pres.pptx", "password")
If pvw Is Nothing Then MsgBox "no pvw" Else MsgBox "got pvw"
pvw.Activate
Set pvw = Nothing
Set ppt = Nothing
MsgBox "end"
是的,我知道,代码很讨厌,但是让VSTO参与进来或使用更强类型的代码也无济于事,我只是想出了尽可能简单的代码,将“运动部件”的数量减少到最少复制问题。我已经放入MsgBox调用,以便可以看到失败的地方。
当我使用VSTO尝试等效时,出现以下错误:
System.Runtime.InteropServices.COMException (0x80004005): Unspecified error (Exception from HRESULT: 0x80004005 (E_FAIL))
at Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet(Object o, Type objType, String name, Object[] args, String[] paramnames, Boolean[] CopyBack)
at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
我试图通过将上述代码作为VBA放入.vbs脚本并运行它来排除COM互操作,但这也失败了:
Error: Unspecified error
Code: 80004005
最后,我尝试通过宏直接在PowerPoint本身中直接运行此命令,但这也失败,并显示以下错误:
Method 'Open' of object 'ProtectedViewWindows' failed
我根本无法在受影响的计算机上使用它-要重现它,只需创建并保存pptx格式的受密码保护的PowerPoint演示文稿,然后在上面的代码中适当地修改路径和密码,然后如果有时间,可以作为宏或vbs运行,也可以通过VSTO运行。
我尝试了很多事情:
此计算机已经在32位和64位版本的Office 365(当前在32位Office 365上)之间反弹,它是64位Windows 7系统。
我什至尝试通过SysInternals的Process Monitor对其进行监视,但是似乎什么也没发生,冲走了消息框和受保护的打开事件之间记录的数十万种东西。
我看到PowerPoint 可以读取文件,因为受保护的视图窗口会短暂闪烁,并提及相关文件。如果我故意拼写错误的文件名(以查看文件名是否试图打开它),则会收到另一个错误。如果我故意拼写错误的密码,还会收到另一个错误,这确实意味着PowerPoint可以访问和读取/解密文件。显然,我试图在PowerPoint中手动打开文件并手动输入密码,效果很好。
感觉真的像是PowerPoint本身内部有一些深层的断裂-好像它可以打开,解密和读取文件一样,一旦“获得”该文件,它就要进行最后的一系列测试,然后进行一次这些失败了,但是它只给出了通用且无用的错误E_FAIL(0x80004005)。
关于计算机本身,没有什么“特殊的”东西,它不是域/ AD的一部分,没有开发人员工具,也没有人在“玩”注册表权限或类似的事情。
我完全不知道它为什么失败-进行Office安装“修复”似乎没有什么区别,也没有对Office进行完全卸载/重新安装。我没有尝试从头开始重新加载操作系统,但这并不是真正的选择,这种配置很可能在“荒野”中遇到,所以我宁愿找到根本原因。
有什么想法吗?
谢谢, 尼克。