Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
485 views
in Technique[技术] by (71.8m points)

vb.net - unable to cast COM object of type microsoft.office.interop.outlook.applicationclass to interface type Microsoft.Office.Interop.Outlook._Application

Perform a development where it is necessary for me to obtain the mail that is registered in the Outlook session in Windows. In that sense, the only thing that the user has to do is enter their windows session password to be able to log in and then go to a SharePoint and download several files. At the time of executing the programming, it sends me the following error.

Please verify whit the support the next error: Unable to cast COM object type 'Microsoft.Office.Interop.Outlook.ApplicationClass' to interface type 'Microsoft.Office.Interop.Outlook._Application'. This operation failed because the QueryInterface call on the COM component for the interface with ID '{00063001-0000-0000-C000-000000000046}' failed due to the following error: Error loading type library/DLL. (Exception from HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY)).

I already checked in regedit, but the subkey is at 0, I investigated this a little in other internet sites but I still have the same problem. Can you help me to see where the error is? This is the code that I developed.

The Outlook version is 2016 (O365) and Windows 10.

Imports System.Security
Imports Microsoft.SharePoint.Client
Imports System.Runtime.InteropServices
Imports Microsoft.Office.Interop
Imports System.IO

Imports Microsoft.SharePoint
Imports System.Net
Imports System.Net.Http
Imports Microsoft.ProjectServer.Client
Imports System
Imports System.Management
Imports System.Text
Imports Outlook = Microsoft.Office.Interop.Outlook

Module UpdateDB
    Dim password As String
    Dim url As String
    Dim username As String
    Dim ctx As ClientContext

    Dim securedPassword

    Public Function updateDb(value As Integer)
        Try

            ActivateOL()

            Dim outlook As Outlook.Application = New Outlook.Application()

            Dim addrEntry As Outlook.AddressEntry = outlook.Session.CurrentUser.AddressEntry

            If addrEntry.Type = "EX" Then
                Dim currentUser As Outlook.ExchangeUser = outlook.Session.CurrentUser.AddressEntry.GetExchangeUser()

                If currentUser IsNot Nothing Then
                    Dim sb As StringBuilder = New StringBuilder()
                    username = currentUser.PrimarySmtpAddress
                End If
            End If

            Dim siteUrl As String = "https://name_company.sharepoint.com/sites/test/"

            password = Form1.MyInputBox("Please Enter Your Password")


            Form1.ProgressBar1.Minimum = 0
            Form1.ProgressBar1.Maximum = 28
            Form1.ProgressBar1.Visible = True
            Form1.Label115.Visible = True
            Form1.Label115.BringToFront()
            Form1.ProgressBar1.Value = 0


            url = "https://name_company.sharepoint.com/sites/test/SiteFiles/test.txt"

            ctx = New ClientContext(url)

            securedPassword = New SecureString()
            For Each c In password.ToCharArray()
                securedPassword.AppendChar(c)
            Next


            My.Computer.FileSystem.DeleteFile("C:Tempest.txt")
            ctx.Credentials = New SharePointOnlineCredentials(username, securedPassword)
            DownloadFile(url, ctx.Credentials, "C:Tempest.txt")
            Form1.ProgressBar1.Value = 1
        Catch ex As Exception
            MsgBox("Please verify whit the support the next error: " & ex.Message, MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "TEST")
            Form1.ProgressBar1.Value = 0
            Form1.ProgressBar1.Visible = False
            value = 1
            Return value
            GoTo finFunction
        End Try
        ctx.Credentials = New SharePointOnlineCredentials(username, securedPassword)

        url = "https://name_company.sharepoint.com/sites/test/DATA%20BASE/DEVICES.xlsx"
        ctx = New ClientContext(url)
        ctx.Credentials = New SharePointOnlineCredentials(username, securedPassword)
        DownloadFile(url, ctx.Credentials, "C:UsersPublicDocumentsTEST.xlsx")
        Form1.ProgressBar1.Value = 3


        MsgBox("UPDATED COMPLETED", MsgBoxStyle.Information + MessageBoxButtons.OK, "ABB - MNS PRO")

        Form1.ProgressBar1.Visible = False
        Form1.Label115.Visible = False
finFunction:
    End Function

    Sub DownloadFile(ByVal webUrl As String, ByVal credentials As ICredentials, ByVal fileRelativeUrl As String)
        Using client = New WebClient()
            client.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f")
            client.Headers.Add("User-Agent: Other")
            client.Credentials = credentials
            client.DownloadFile(webUrl, fileRelativeUrl)
        End Using
    End Sub

    Sub DeleteFilesInsideFolder(ByVal target_folder_path As String)
        ' loop through each file in the target directory
        For Each file_path As String In Directory.GetFiles(target_folder_path)
            ' delete the file if possible...otherwise skip it
            Try
                My.Computer.FileSystem.DeleteFile(file_path)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "TEST")
            End Try
        Next
    End Sub

    <DllImport("netapi32.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Unicode)>
    Public Function NetUserChangePassword(
     <MarshalAs(UnmanagedType.LPWStr)> ByVal OldPass As String) As Integer
    End Function

    Public Sub ChangePassword(ByVal oldPassword As String)
        Try
            NetUserChangePassword(oldPassword)
        Catch ex As Exception
            Throw
        End Try
    End Sub

    Sub ActivateOL()
        'Error 429 occurs with GetObject if Outlook is not running.
        On Error Resume Next
        Dim objOutlook = GetObject(, "Outlook.Application")

        If Err.Number = 429 Then 'Outlook is NOT running.
            MsgBox("Outlook is not running")
        End If
    End Sub
End Module

Thanks for the support.

First Update

    Public Function updateDb(value As Integer)
        Try

            ActivateOL()

            Dim outlook As Outlook.Application = Nothing

            Try
                outlook = DirectCast(Marshal.GetActiveObject("Outlook.Application"), Outlook.Application)
            Catch
                outlook = New Outlook.Application()
            End Try
    End Sub

    Sub ActivateOL()
        'Error 429 occurs with GetObject if Outlook is not running.
        Dim objOutlook = GetObject(, "Outlook.Application")

        If Err.Number = 429 Then 'Outlook is NOT running.
            MsgBox("Outlook is not running")
        End If
    End Sub
question from:https://stackoverflow.com/questions/65932155/unable-to-cast-com-object-of-type-microsoft-office-interop-outlook-applicationcl

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)
Waitting for answers

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...