升级Office至365后无法创建ActiveX组件问题求助
Office 365升级后定制软件无法发送邮件(错误:Cannot create ActiveX component)
客户将Office升级至Office 365后,其定制软件无法发送邮件,弹出错误提示 "Cannot create ActiveX component"。
环境信息
- 定制软件:基于Visual Studio 2013开发,目标CPU为x86,目标框架为.NET Framework 4
- 运行机器:Windows 10 Pro 10.0.19045 Build 19045
- Outlook版本:2409(内部版本18025.20140)
- 引用组件:Microsoft.Office.Interop.Outlook.dll 版本14.0.4760.1000(大小950KB)
- 额外发现:Outlook中"Microsoft VBA for Outlook Addin"处于未激活状态,暂不确定是否关联问题
已尝试操作
- 将Microsoft.Office.Interop.Outlook.dll放入EXE所在文件夹
- 将该DLL放入System32文件夹
- 将该DLL放入SysWow64文件夹
注册表权限情况
HKEY_CLASSES_ROOT\Outlook.Application.16权限:管理员拥有完全控制权限,普通用户无权限
相关代码
Private Sub btnemail_Click(sender As System.Object, e As System.EventArgs) Handles btnemail.Click Dim emailadd As String = "" Dim cownt As Integer = 0 Using conn As New SqlConnection Try conn.ConnectionString = ConnectionString Dim command2 As New SqlCommand("CustSelEmail", conn) command2.CommandType = CommandType.StoredProcedure command2.Parameters.Add(New SqlParameter("@Nick", NickNom)) Dim SQLParamOP As New SqlParameter("@Workd", "") SQLParamOP.Direction = ParameterDirection.Output command2.Parameters.Add(SQLParamOP) conn.Open() Dim reader As SqlDataReader = command2.ExecuteReader While reader.Read emailadd = reader(0).ToString End While conn.Close() If emailadd = "" Then MsgBox("There is no email address for this Customer account") Exit Sub End If If My.Computer.FileSystem.FileExists("Filename" & NickNom & ".pdf") = True Then My.Computer.FileSystem.DeleteFile("Filename" & NickNom & ".pdf", FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) End If crreportdocument.ExportToDisk(ExportFormatType.PortableDocFormat, "Filename" & NickNom & ".pdf") Dim myolapp As Object myolapp = GetObject("Outlook.Application") Create: If myolapp Is Nothing Then myolapp = CreateObject("Outlook.Application") End If Dim mailItem As Outlook.MailItem = myolapp.CreateItem(Outlook.OlItemType.olMailItem) mailItem.Subject = "Company Invoice" mailItem.To = emailadd mailItem.Body = "Invoice is attached." mailItem.Importance = Outlook.OlImportance.olImportanceNormal mailItem.Attachments.Add("Filename" & NickNom & ".pdf", Outlook.OlAttachmentType.olByValue, 1, "Filename" & NickNom & ".pdf") mailItem.Display(True) 'Shows the email on screen mailItem = Nothing myolapp = Nothing Catch ex As Exception If ex.GetBaseException.Message = "Cannot create ActiveX component." And cownt < 25 Then 'For Outlook 2010 cownt = cownt + 1 'To stop infinite loop when genuine error GoTo Create End If MsgBox(ex.GetBaseException.Message, MsgBoxStyle.OkOnly, " e-mail") Error_Log(modname, cboCustFrom.Text & " - " & cboCustTo.Text, ex, "e-mail") Finally conn.Close() End Try End Using End Sub
解决方案建议
1. 修复Interop DLL版本不匹配问题
当前使用Office 2010版本的Interop DLL(14.0),与Office 365(对应Outlook 16.0)版本不兼容,是导致ActiveX创建失败的核心原因:
- 移除项目中旧版
Microsoft.Office.Interop.Outlook.dll引用 - 通过NuGet安装Microsoft.Office.Interop.Outlook兼容Office 365的版本
- 重新编译软件,发布时确保携带正确版本的Interop DLL
2. 调整注册表权限
普通用户无HKEY_CLASSES_ROOT\Outlook.Application.16权限会无法访问Outlook COM对象:
- 打开注册表编辑器(
regedit),定位到HKEY_CLASSES_ROOT\Outlook.Application.16 - 右键选择「权限」,添加当前普通用户账户,赋予「读取」权限
- 重启软件和Outlook测试
3. 重新注册Outlook COM组件
Office升级可能导致COM组件注册异常:
- 以管理员身份打开命令提示符(CMD)
- 执行注册命令:
(32位Office路径为cd "C:\Program Files\Microsoft Office\root\Office16" regsvr32.exe outlook.exeC:\Program Files (x86)\Microsoft Office\root\Office16)
4. 启用Outlook VBA加载项
未激活的VBA加载项可能影响COM交互,可尝试启用:
- 打开Outlook,依次点击「文件」→「选项」→「加载项」
- 「管理」下拉选择「COM加载项」,点击「转到」
- 勾选「Microsoft VBA for Outlook Addin」,确定后重启Outlook
5. 优化代码中的COM对象创建逻辑
原代码GetObject调用缺少实例参数,可修改为更兼容的写法:
Dim myolapp As Object Try myolapp = GetObject(, "Outlook.Application") '逗号表示获取已运行的Outlook实例 Catch myolapp = CreateObject("Outlook.Application") End Try
内容的提问来源于stack exchange,提问作者OldCoder
相关产品推荐
相关产品推荐

