You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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)
  • 执行注册命令:
    cd "C:\Program Files\Microsoft Office\root\Office16"
    regsvr32.exe outlook.exe
    
    (32位Office路径为C:\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:38:15