CreateObject("Outlook.Application") 在某些装有 Office 365 的计算机上不起作用

如何解决CreateObject("Outlook.Application") 在某些装有 Office 365 的计算机上不起作用

我有一个客户端站点,在多台装有 64 位 Office 365 的计算机上运行我们的 Windows 桌面软件。

在他们的大多数计算机上,我们的软件都可以通过 Outlook 发送电子邮件

但是,去年他们的两台计算机升级到了 365(由他们的 IT 技术人员,而不是我们),并且当他们尝试从我们的软件发送电子邮件时都失败了。

Outlook 本身运行良好,我们的软件也是如此 - 在这两台计算机上。但是这两个都不能从我们的软件发送电子邮件。 (其他可以正常发送电子邮件的计算机运行的版本与我们的软件完全相同。)

发送电子邮件时,我们的软件首先检查 Windows 注册表中是否存在“outlook.application”或“outlook.application.*”键,以确定是否安装了 Outlook。如果未找到,我们的程序逻辑假定未安装 Outlook,并尝试使用 MAPI 通过其他电子邮件客户端(如 Thunderbird)(或使用 MAPI 通过 Outlook)发送邮件。但是,这些计算机随后都崩溃了,因为 MAPI 不能在 64 位计算机上运行。

当我调查这两台有问题的计算机时,我发现它们的 Windows 注册表中的任何位置都没有“outlook.application”或“outlook.application.16”键。我以前从未遇到过这种情况。在不创建这些注册表项的情况下,Office 365 如何以及为何安装? (我刚刚在我办公室的两台计算机上安装了 Office 365,它们都有这些密钥并且运行良好。我们以前从未在任何其他用户站点遇到过这种情况。)

我与他们的 IT 技术人员讨论了这个问题。他完全卸载了 Office 365,并使用“在线”安装(我在我的计算机上使用过 - 我向他发送了 URL 以确保)从头开始安装它们。但是,此后他们仍然无法发送电子邮件。当我调查时,我发现注册表项仍然丢失。

然后他们的 IT 技术人员让我导出“Computer\HKEY_CLASSES_ROOT”中的所有“outlook.application”和“outlook.application.16”键并将它们发送给他。他在这两台计算机上都导入了这些,但并没有解决问题。

但是,由于密钥现在已经存在,我们的软件随后尝试使用 OLE 直接通过 Outlook 发送电子邮件。然而,它在尝试创建 Outlook 应用程序对象的那一行崩溃了:

loApp = CreateObject("outlook.application.16")

我构建了一个特殊版本,其中包含一些额外的测试代码。上面一行运行失败后,它尝试运行一行:

loApp = CreateObject("outlook.application")

这也失败了 - 大概是因为尚未安装某些 Outlook 应用程序组件。

我在 Google 上搜索了一些可能确定解决方案的帖子,但没有找到任何合适的内容。一些帖子建议从安装工具运行 Office“修复”。

我向他们的技术人员提到了这一点,他就这样做了。有趣的是,当我检查(使用 RegEdit)时,它创建了更多的“outlook.application”和“outlook.application.16”注册表项。但是我们的软件在该测试版本中的“CreateObject”行和普通版本中的单个“CreateObject”行上仍然失败。

他们的技术人员和我都完全迷惑了(现在我们对 Office 365 安装和 Windows 的 Microsoft 黑色艺术的了解已超出我们的深度)。

以前有没有人遇到过这种情况,和/或可以建议我们可以从哪里开始?


好吧,原来的帖子有点长,我不想用太多的信息把它弄乱。所以这里有一些进一步的信息:

回答尤金的问题:

  1. 使用 RegEdit,我搜索了整个注册表 - 寻找其中一个 不能工作的电脑,还有一台能用的电脑(加上我自己的,在这里, 这也很好)。
  2. 他们的技术人员安装了最新的 64 位 365。如果我明白 正确,初始安装是从 ISO 文件完成的。当那个 没有用,他再次尝试使用“在线”安装(我有 在这里成功使用)。他再次使用“在线”安装进行“修复”。我没有当前的版本号,但如果相关,可以在本周晚些时候获得这些。但它们应该是最新的。
  3. 不,我们无法自己在内部重现问题,而且从来没有 之前在任何其他客户网站上看到过。
  4. 该网站在所有计算机上运行相同的防病毒软件(那些 那些工作,那些没有)。所以我怀疑这不会是 原因。

在这两台计算机上完美匹配的注册表项是:

Computer\HKEY_CLASSES_ROOT\CLSID\{0006F03A-0000-0000-C000-000000000046}
Computer\HKEY_CLASSES_ROOT\outlook.application
Computer\HKEY_CLASSES_ROOT\outlook.application.16
Computer\HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{0006F03A-0000-0000-C000-000000000046}

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0006F03A-0000-0000-C000-000000000046}
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\outlook.application
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\outlook.application.16
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WOW6432Node\CLSID\{0006F03A-0000-0000-C000-000000000046}

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\AppVMachineRegistryStore\Integration\Backup\Software\RegisteredApplications
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\AppVMachineRegistryStore\Integration\Ownership\Software\Classes\outlook.application
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\AppVMachineRegistryStore\Integration\Ownership\Software\Classes\outlook.application.16
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\AppVMachineRegistryStore\Integration\Ownership\Software\RegisteredApplications

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Classes\CLSID\{0006F03A-0000-0000-C000-000000000046}
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Classes\outlook.application
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Classes\outlook.application.16
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Classes\Wow6432Node\CLSID\{0006F03A-0000-0000-C000-000000000046}\InprocServer32
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\RegisteredApplications
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Classes\CLSID\{0006F03A-0000-0000-C000-000000000046}
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\RegisteredApplications

一些可能很重要的事情: 无法工作的计算机上的 Windows 注册表有四个额外的键(不在工作的计算机中):

Computer\HKEY_CLASSES_ROOT\PackagedCom\ProgIdindex\outlook.application
Computer\HKEY_CLASSES_ROOT\PackagedCom\ProgIdindex\outlook.application\Microsoft.Office.Desktop.Outlook_16051.12325.20298.0_x86__8wekyb3d8bbwe
Computer\HKEY_CLASSES_ROOT\PackagedCom\ProgIdindex\outlook.application.16
Computer\HKEY_CLASSES_ROOT\PackagedCom\ProgIdindex\outlook.application.16\Microsoft.Office.Desktop.Outlook_16051.12325.20298.0_x86__8wekyb3d8bbwe

那台计算机(不能工作)还有一个文件夹 C:\ProgramData\Packages\Microsoft.Office.Desktop.Outlook_8wekyb3d8bbwe\,里面有 3 个子文件夹(带有系统生成名称):

  • 一个(创建于 2019 年)有一个文件夹“\SystemAppData”,它是 空的。
  • 另外两个(都在 2020 年初具有相同的日期/时间)完全是 空(即没有 SystemAppData 子文件夹)

我想知道这些键是否会以某种方式造成恶作剧。下周初,我和技术人员计划备份这些密钥,然后将其删除

有谁知道这些钥匙是关于什么的? (我发现了一个可能相关的博客https://blogs.windows.com/windowsdeveloper/2017/04/13/com-server-ole-document-support-desktop-bridge/ 但话又说回来,它可能不是。)

解决方法

请记住,旧版本的 Windows 应用商店 Outlook 在沙箱中运行,无法从外部访问。卸载它并从商店重新安装 - 您将获得一个普通的 C2R 版本。

,

尤里卡!!!删除那些额外的旧注册表项就成功了。

Computer\HKEY_CLASSES_ROOT\PackagedCom\ProgIdIndex\Outlook.Application
Computer\HKEY_CLASSES_ROOT\PackagedCom\ProgIdIndex\Outlook.Application\Microsoft.Office.Desktop.Outlook_16051.12325.20298.0_x86__8wekyb3d8bbwe
Computer\HKEY_CLASSES_ROOT\PackagedCom\ProgIdIndex\Outlook.Application.16
Computer\HKEY_CLASSES_ROOT\PackagedCom\ProgIdIndex\Outlook.Application.16\Microsoft.Office.Desktop.Outlook_16051.12325.20298.0_x86__8wekyb3d8bbwe

我们的软件立即能够创建 Outlook 应用程序对象,并通过 Outlook 发送电子邮件。

这些额外的密钥似乎可以追溯到客户较早的尝试安装(在他们当前的技术人员参与之前)。在注册表的那部分中大约有 20 个其他“Outlook*”键,它们的名称中带有“8wekyb3d8bbwe”。我随后也删除了这些 - 假设它们都是遗留垃圾。 (通常,删除您不理解的内容是非常危险的 - 但到目前为止,还不错。虽然我太胆小了,无法删除该位置的 Access、Excel、PowerPoint、带有 ' 的 Word 中的许多其他人他们的名字中也有 8wekyb3d8bbwe'。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?