我有一个客户端站点,在多台装有 64 位 Office 365 的计算机上运行我们的 Windows 桌面软件。
在他们的大多数计算机上,我们的软件都能够通过 Outlook 发送电子邮件。
但是,他们的两台计算机去年升级到了 365(由他们的 IT 技术人员,而不是我们),当他们尝试从我们的软件发送电子邮件时都失败了。
Outlook 本身可以正常工作,我们的软件在这两台计算机上也可以正常工作。但是这两个都不能从我们的软件发送电子邮件。(可以正常发送电子邮件的其他计算机正在运行我们软件的完全相同版本。)
发送电子邮件时,我们的软件首先检查 Windows 注册表中是否存在“Outlook.Application”或“Outlook.Application.*”键,以确定是否安装了 Outlook。如果未找到,我们的程序逻辑会假定未安装 Outlook,并尝试使用 MAPI 来通过另一个电子邮件客户端(如 Thunderbird)(或通过 Outlook 使用 MAPI)发送邮件。但是,这些计算机随后都崩溃了,因为 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 的微软黑魔法的深度)。
以前有没有人遇到过这种情况,和/或可以建议我们从这里去哪里?
好的,原来的帖子有点长,我不想用太多的信息把它弄得乱七八糟。所以这里有一些进一步的信息:
回答尤金的问题:
- 使用 RegEdit,我搜索了整个注册表——其中一台无法运行的计算机,以及一台运行良好的计算机(加上我自己的,它也运行良好)。
- 他们的技术人员安装了最新的 64 位 365。如果我理解正确,初始安装是从 ISO 文件完成的。当这不起作用时,他再次尝试使用“在线”安装(我在这里成功使用过)。他再次使用“在线”安装进行“修复”。我没有当前的内部版本号,但如果相关的话,可以在本周晚些时候获得这些版本号。但它们应该是最新的。
- 不,我们自己无法在内部重现该问题,并且以前从未在任何其他客户站点看到它。
- 该站点在所有计算机上运行相同的防病毒软件(那些工作的和那些不工作的)。所以我怀疑这不是原因。
在这两台计算机上完美匹配的注册表项是:
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/ 不过话说回来,可能不是.)