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



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

在他们的大多数电脑上,我们的软件能够通过Outlook发送电子邮件。

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

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

当发送电子邮件时,我们的软件首先检查";Outlook.Application;或";Outlook.Application.*";键,以确定是否安装了Outlook。如果找不到,我们的程序逻辑会假设Outlook没有安装,并尝试使用MAPI通过另一个电子邮件客户端(如Thunderbird)发送邮件(或使用MAPI通过Outlook发送邮件)。但是,这两台计算机都崩溃了,因为MAPI在64位计算机上不起作用。

当我调查这两台有问题的电脑时,我发现它们都没有"Outlook.Application;或";Outlook.Application.16";键在其Windows注册表中的任何位置。我以前从未遇到过这种情况。在不创建这些注册表项的情况下,Office 365将如何安装以及为什么安装?(我刚刚在办公室的两台电脑上安装了Office 365,它们都有这些密钥,工作非常完美。我们以前从未在任何其他用户网站上遇到过这种情况。)

我和他们的IT技术人员讨论了这个问题。他完全卸载了Office 365,并使用";在线";安装(我在电脑上用过的——我把网址发给了他)。然而,在这之后,他们仍然无法发送电子邮件。当我调查时,我发现注册表项仍然不见了。

然后,他们的IT技术人员要求我将所有";Outlook.Application;以及";Outlook.Application.16";键在";计算机\HKEY_CLASSES_ROOT";把它们寄给他。他在这两台电脑上都导入了这些,但并没有解决问题。

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

loApp = CreateObject("Outlook.Application.16")

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

loApp = CreateObject("Outlook.Application")

这也失败了——可能是因为一些Outlook应用程序组件尚未安装。

我在谷歌上做了一些相当广泛的搜索,寻找可能找到解决方案的帖子,但似乎没有找到合适的。有几个帖子建议运营一个"办公室";修理";从安装工具。

我向他们的技术人员提到了这件事,他照做了。有趣的是,当我检查(使用RegEdit)时,它创建了更多的";Outlook.Application;以及";Outlook.Application.16";注册表项。但我们的软件仍然在";CreateObject";该测试版本中的行;CreateObject";正常版本中的行。

他们的技术人员和我都完全感到困惑(现在我们对Office 365安装和Windows的微软黑色艺术已经不了解了)。

以前有人遇到过这种情况吗?和/或可以建议我们今后的发展方向吗?


好吧,原来的帖子有点长,我不想用太多信息把它弄得一团糟。因此,这里有一些进一步的信息:

回答Eugene的问题:

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

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

ComputerHKEY_CLASSES_ROOTCLSID{0006F03A-0000-0000-C000-000000000046}
ComputerHKEY_CLASSES_ROOTOutlook.Application
ComputerHKEY_CLASSES_ROOTOutlook.Application.16
ComputerHKEY_CLASSES_ROOTWOW6432NodeCLSID{0006F03A-0000-0000-C000-000000000046}
ComputerHKEY_LOCAL_MACHINESOFTWAREClassesCLSID{0006F03A-0000-0000-C000-000000000046}
ComputerHKEY_LOCAL_MACHINESOFTWAREClassesOutlook.Application
ComputerHKEY_LOCAL_MACHINESOFTWAREClassesOutlook.Application.16
ComputerHKEY_LOCAL_MACHINESOFTWAREClassesWOW6432NodeCLSID{0006F03A-0000-0000-C000-000000000046}
ComputerHKEY_LOCAL_MACHINESOFTWAREMicrosoftOfficeClickToRunAppVMachineRegistryStoreIntegrationBackupSoftwareRegisteredApplications
ComputerHKEY_LOCAL_MACHINESOFTWAREMicrosoftOfficeClickToRunAppVMachineRegistryStoreIntegrationOwnershipSoftwareClassesOutlook.Application
ComputerHKEY_LOCAL_MACHINESOFTWAREMicrosoftOfficeClickToRunAppVMachineRegistryStoreIntegrationOwnershipSoftwareClassesOutlook.Application.16
ComputerHKEY_LOCAL_MACHINESOFTWAREMicrosoftOfficeClickToRunAppVMachineRegistryStoreIntegrationOwnershipSoftwareRegisteredApplications
ComputerHKEY_LOCAL_MACHINESOFTWAREMicrosoftOfficeClickToRunREGISTRYMACHINESoftwareClassesCLSID{0006F03A-0000-0000-C000-000000000046}
ComputerHKEY_LOCAL_MACHINESOFTWAREMicrosoftOfficeClickToRunREGISTRYMACHINESoftwareClassesOutlook.Application
ComputerHKEY_LOCAL_MACHINESOFTWAREMicrosoftOfficeClickToRunREGISTRYMACHINESoftwareClassesOutlook.Application.16
ComputerHKEY_LOCAL_MACHINESOFTWAREMicrosoftOfficeClickToRunREGISTRYMACHINESoftwareClassesWow6432NodeCLSID{0006F03A-0000-0000-C000-000000000046}InprocServer32
ComputerHKEY_LOCAL_MACHINESOFTWAREMicrosoftOfficeClickToRunREGISTRYMACHINESoftwareRegisteredApplications
ComputerHKEY_LOCAL_MACHINESOFTWARERegisteredApplications
ComputerHKEY_LOCAL_MACHINESOFTWAREWOW6432NodeClassesCLSID{0006F03A-0000-0000-C000-000000000046}
ComputerHKEY_LOCAL_MACHINESOFTWAREWOW6432NodeRegisteredApplications

可能意义重大的事情:不工作的计算机上的Windows注册表有四个额外的密钥(不在工作的计算机中):

ComputerHKEY_CLASSES_ROOTPackagedComProgIdIndexOutlook.Application
ComputerHKEY_CLASSES_ROOTPackagedComProgIdIndexOutlook.ApplicationMicrosoft.Office.Desktop.Outlook_16051.12325.20298.0_x86__8wekyb3d8bbwe
ComputerHKEY_CLASSES_ROOTPackagedComProgIdIndexOutlook.Application.16
ComputerHKEY_CLASSES_ROOTPackagedComProgIdIndexOutlook.Application.16Microsoft.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/但话说回来,可能不是。)

Eureka!!!删除那些额外的遗留注册表项就成功了。

ComputerHKEY_CLASSES_ROOTPackagedComProgIdIndexOutlook.Application
ComputerHKEY_CLASSES_ROOTPackagedComProgIdIndexOutlook.ApplicationMicrosoft.Office.Desktop.Outlook_16051.12325.20298.0_x86__8wekyb3d8bbwe
ComputerHKEY_CLASSES_ROOTPackagedComProgIdIndexOutlook.Application.16
ComputerHKEY_CLASSES_ROOTPackagedComProgIdIndexOutlook.Application.16Microsoft.Office.Desktop.Outlook_16051.12325.20298.0_x86__8wekyb3d8bbwe

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

这些额外的密钥似乎可以追溯到客户早些时候尝试安装的时候(在他们目前的技术人员参与之前)。在注册表的这一部分中,大约有20个其他"Outlook*"键的名称为"8wekyb3d8bbwe"。我随后也删除了这些——假设它们都是遗留垃圾。(通常,删除你不理解的东西是非常危险的,但到目前为止,一切都很好。尽管我太胆小了,无法删除该位置的Access、Excel、PowerPoint、Word中名称中也有"8wekyb3d8bbwe"的许多其他内容。)

请记住,旧版本的Windows Store Outlook在沙盒中运行,无法从外部访问。卸载它,然后从商店重新安装-你会得到一个普通的C2R版本。

我遇到了同样的问题;它来自一台全新的电脑!

对我有效的是提前装订。选择:工具>参考>Microsoft Outlook 16对象库

Dim objOL As Outlook.Application
Set objOL = New Outlook.Application
Set objOL = Nothing

最后,将objOL设置为Nothing是至关重要的,否则实例将保持打开状态,这会导致Outlook出现问题。

参考。

经过测试,可与Office365配合使用。在C#项目中安装Nuget包Microsoft.Office.Interop.Outlook。此项目有一个带有"发送"按钮的windows窗体。

private void buttonSendEmail_Click(object sender, EventArgs e)
{

string[] attachFiles = new string[] {
@"C:temptest.txt"
};
SendMailWithOutlook("Subject1", "This is an example.", "youremail@here.com", attachFiles, MailSendType.ShowModal);
}

public bool SendMailWithOutlook(string subject, string htmlBody, string recipients, string[] filePaths, MailSendType sendType)
{
try
{
// create the outlook application. see nuget package 
Microsoft.Office.Interop.Outlook.Application outlookApp = new Microsoft.Office.Interop.Outlook.Application();
if (outlookApp == null)
return false;
// create a new mail item.
Microsoft.Office.Interop.Outlook.MailItem mail = (Microsoft.Office.Interop.Outlook.MailItem)outlookApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
// set html body. 
// add the body of the email
mail.HTMLBody = htmlBody;
//Add attachments.
if (filePaths != null)
{
foreach (string file in filePaths)
{
//attach the file
Microsoft.Office.Interop.Outlook.Attachment oAttach = mail.Attachments.Add(file);
}
}
mail.Subject = subject;
mail.To = recipients;
if (sendType == MailSendType.SendDirect)
mail.Send();
else if (sendType == MailSendType.ShowModal)
mail.Display(true);
else if (sendType == MailSendType.ShowModeless)
mail.Display(false);
mail = null;
outlookApp = null;
return true;
}
catch (Exception ex)
{
Debug.WriteLine("Email send error: " + ex.Message);
return false;
}
}

在我们的一个安装中,我在HKLM中的正确引用旁边也在HKCU\Software\classes\interface\中找到了所有实例化的office键{0006*},但或多或少是空的,至少没有typelib子键引用。从HKCU路径中删除所有这些空键,Windows更喜欢HKLM,在这种情况下解决了isue。

相关内容

  • 没有找到相关文章

最新更新