Click here to Skip to main content
15,890,882 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I made a dll in visual basic 9 (visual studio 2008) and when I try to instantiate in Visual Basic 6 I get error 429 "the ActiveX control can't create object", I call it by reference to the .tlb file created from the dll. Then I register it with Regasm MyDllName.dll /tlb: MyTblName.tlb /codebase, so when I try to instantiate the Class from VB6 I get "Error -2146232576 (80131700) Automation error"

XML
Imports System.Text
Imports Microsoft.VisualBasic.CompilerServices

<ComClass(ClaseCom.ClassId, ClaseCom.InterfaceId, ClaseCom.EventsId)> _
Public Class ClaseCom

#Region "GUID de COM"
    ' Estos GUID proporcionan la identidad de COM para esta clase
    ' y las interfaces de COM. Si las cambia, los clientes
    ' existentes no podrán obtener acceso a la clase.
    Public Const ClassId As String = "c80adf21-0391-403a-a4bd-1373c4556d60"
    Public Const InterfaceId As String = "91382c5a-3d5e-419e-8436-805eccd517d0"
    Public Const EventsId As String = "3aedcd4b-5458-4d26-ab6c-a9c890e1784a"
#End Region

    ' Una clase COM que se puede crear debe tener Public Sub New()
    ' sin parámetros, si no la clase no se
    ' registrará en el registro COM y no se podrá crear a
    ' través de CreateObject.
    Public Sub New()
        MyBase.New()
    End Sub
    ''' <summary>
    ''' Toma una frase codificada en UTF8, ISO-8859-1 o Windows-1252, ya sea en base64 o en
    ''' Quoted-Printable de la cual se obtiene un string decodificado y legible
    ''' </summary>
    ''' <param name="FraseCodificada">Frase codificada</param>
    ''' <returns>Frase decodificada</returns>
    ''' <remarks></remarks>
    Public Function DecodificarFraseCompleta(ByVal FraseCodificada As String) As String
        Try
            Dim StringDecodificado As String = "Texto no codificado en UTF8 ni ISO"
            FraseCodificada = FraseCodificada.Replace("Subject: ", "") 'primero, se quita el "Subject: " contenido en el string
            'ahora preguntamos si contiene codifcaciones utf8?b?,utf8?q?, iso-8859-1?q? o iso-8859-1?b?
            If FraseCodificada.ToUpper().Contains("=?UTF-8?B?") Then
                StringDecodificado = "" 'limpiamos el string, asi nos aseguramos de que si entró al if
                FraseCodificada = FraseCodificada.Replace("=?utf-8?B?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?UTF-8?B?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?utf-8?b?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?UTF-8?b?", "Ю†;:*") 'reemplazamos la marca de inicio de utf8 por una propia
                FraseCodificada = FraseCodificada.Trim() 'removemos espacios vacios si es que hay
                Dim frasesDelSubject As String() = FraseCodificada.Split("Ю†;:") 'separamos la frase completa en unas mas pequeñas delimitadas por nuestra marca propia
                For Each frase As String In frasesDelSubject
                    If frase.Contains("†;:*") Then
                        frase = frase.Replace("?=", "ЖЖЖЖ") 'reemplazamos la marca del final de utf8 por una propia
                        Dim palabras As String() = frase.Split("ЖЖЖЖ") 'separamos por el caracter Ж dandonos un margen de 4 espacios en el arreglo
                        For Each cadena As String In palabras
                            If cadena.Contains("†;:*") Then
                                cadena = cadena.Replace("†;:*", "")
                                StringDecodificado = StringDecodificado & DecodificarUTF8Base64(cadena)
                            Else
                                StringDecodificado = StringDecodificado & cadena
                            End If
                        Next
                    Else
                        StringDecodificado = StringDecodificado & frase
                    End If
                Next
            ElseIf FraseCodificada.ToUpper().Contains("=?UTF-8?Q?") Then
                StringDecodificado = "" 'limpiamos el string, asi nos aseguramos de que si entró al if
                FraseCodificada = FraseCodificada.Replace("=?utf-8?Q?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?UTF-8?Q?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?utf-8?q?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?UTF-8?q?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Trim()
                Dim frasesDelSubject As String() = FraseCodificada.Split("Ю†;:") 'separamos la frase completa en unas mas pequeñas delimitadas por nuestra marca propia
                For Each frase As String In frasesDelSubject
                    If frase.Contains("†;:*") Then
                        frase = frase.Replace("?=", "ЖЖЖЖ") 'reemplazamos la marca del final de utf8 por una propia
                        Dim palabras As String() = frase.Split("ЖЖЖЖ") 'separamos por el caracter Ж dandonos un margen de 4 espacios en el arreglo
                        For Each cadena As String In palabras
                            If cadena.Contains("†;:*") Then
                                cadena = cadena.Replace("†;:*", "")
                                StringDecodificado = StringDecodificado & DecodificarUTF8QuotedPrintable(cadena)
                            Else
                                StringDecodificado = StringDecodificado & cadena
                            End If
                        Next
                    Else
                        StringDecodificado = StringDecodificado & frase
                    End If
                Next
            ElseIf FraseCodificada.ToUpper().Contains("=?ISO-8859-1?Q?") Then
                StringDecodificado = "" 'limpiamos el string, asi nos aseguramos de que si entró al if
                FraseCodificada = FraseCodificada.Replace("=?iso-8859-1?Q?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?ISO-8859-1?Q?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?iso-8859-1?q?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?ISO-8859-1?q?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Trim()
                Dim frasesDelSubject As String() = FraseCodificada.Split("Ю†;:") 'separamos la frase completa en unas mas pequeñas delimitadas por nuestra marca propia
                For Each frase As String In frasesDelSubject
                    If frase.Contains("†;:*") Then
                        frase = frase.Replace("?=", "ЖЖЖЖ") 'reemplazamos la marca del final de utf8 por una propia
                        Dim palabras As String() = frase.Split("ЖЖЖЖ") 'separamos por el caracter ç dandonos un margen de 4 espacios en el arreglo
                        For Each cadena As String In palabras
                            If cadena.Contains("†;:*") Then
                                cadena = cadena.Replace("†;:*", "")
                                StringDecodificado = StringDecodificado & DecodificarIsoQuotedPrintable(cadena)
                            Else
                                StringDecodificado = StringDecodificado & cadena
                            End If
                        Next
                    Else
                        StringDecodificado = StringDecodificado & frase
                    End If
                Next
            ElseIf FraseCodificada.ToUpper().Contains("=?ISO-8859-1?B?") Then
                StringDecodificado = "" 'limpiamos el string, asi nos aseguramos de que si entró al if
                FraseCodificada = FraseCodificada.Replace("=?iso-8859-1?B?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?ISO-8859-1?B?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?iso-8859-1?b?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?ISO-8859-1?b?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Trim()
                Dim frasesDelSubject As String() = FraseCodificada.Split("Ю†;:") 'separamos la frase completa en unas mas pequeñas delimitadas por nuestra marca propia
                For Each frase As String In frasesDelSubject
                    If frase.Contains("†;:*") Then
                        frase = frase.Replace("?=", "ЖЖЖЖ") 'reemplazamos la marca del final de utf8 por una propia
                        Dim palabras As String() = frase.Split("ЖЖЖЖ") 'separamos por el caracter ç dandonos un margen de 4 espacios en el arreglo
                        For Each cadena As String In palabras
                            If cadena.Contains("†;:*") Then
                                cadena = cadena.Replace("†;:*", "")
                                StringDecodificado = StringDecodificado & DecodificarISOBase64(cadena)
                            Else
                                StringDecodificado = StringDecodificado & cadena
                            End If
                        Next
                    Else
                        StringDecodificado = StringDecodificado & frase
                    End If
                Next
            ElseIf FraseCodificada.ToUpper().Contains("=?WINDOWS-1252?Q?") Then
                StringDecodificado = "" 'limpiamos el string, asi nos aseguramos de que si entró al if
                FraseCodificada = FraseCodificada.Replace("=?windows-1252?q?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?windows-1252?Q?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?WINDOWS-1252?q?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?WINDOWS-1252?Q?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Trim()
                Dim frasesDelSubject As String() = FraseCodificada.Split("Ю†;:") 'separamos la frase completa en unas mas pequeñas delimitadas por nuestra marca propia
                For Each frase As String In frasesDelSubject
                    If frase.Contains("†;:*") Then
                        frase = frase.Replace("?=", "ЖЖЖЖ") 'reemplazamos la marca del final de utf8 por una propia
                        Dim palabras As String() = frase.Split("ЖЖЖЖ") 'separamos por el caracter ç dandonos un margen de 4 espacios en el arreglo
                        For Each cadena As String In palabras
                            If cadena.Contains("†;:*") Then
                                cadena = cadena.Replace("†;:*", "")
                                StringDecodificado = StringDecodificado & DecodificarWindows1252QuotedPrintable(cadena)
                            Else
                                StringDecodificado = StringDecodificado & cadena
                            End If
                        Next
                    Else
                        StringDecodificado = StringDecodificado & frase
                    End If
                Next
            ElseIf FraseCodificada.ToUpper().Contains("=?WINDOWS-1252?B?") Then
                StringDecodificado = "" 'limpiamos el string, asi nos aseguramos de que si entró al if
                FraseCodificada = FraseCodificada.Replace("=?windows-1252?b?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?windows-1252?B?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?WINDOWS-1252?b?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Replace("=?WINDOWS-1252?B?", "Ю†;:*")
                FraseCodificada = FraseCodificada.Trim()
                Dim frasesDelSubject As String() = FraseCodificada.Split("Ю†;:") 'separamos la frase completa en unas mas pequeñas delimitadas por nuestra marca propia
                For Each frase As String In frasesDelSubject
                    If frase.Contains("†;:*") Then
                        frase = frase.Replace("?=", "ЖЖЖЖ") 'reemplazamos la marca del final de utf8 por una propia
                        Dim palabras As String() = frase.Split("ЖЖЖЖ") 'separamos por el caracter ç dandonos un margen de 4 espacios en el arreglo
                        For Each cadena As String In palabras
                            If cadena.Contains("†;:*") Then
                                cadena = cadena.Replace("†;:*", "")
                                StringDecodificado = StringDecodificado & DecodificarWindows1252Base64(cadena)
                            Else
                                StringDecodificado = StringDecodificado & cadena
                            End If
                        Next
                    Else
                        StringDecodificado = StringDecodificado & frase
                    End If
                Next
            End If

            Return StringDecodificado
        Catch ex As Exception
            Return "Codificacion desconocida, Error al decodificar"
        End Try
    End Function
    ''' <summary>
    ''' Toma el string codificado en Windows-1252 Quoted-Printable (=?WINDOWS-1252?Q?) y lo
    ''' transforma a un string legible
    ''' </summary>
    ''' <param name="texto">Texto Codificado en iso base64</param>
    ''' <returns>Texto decodificado</returns>
    ''' <remarks></remarks>
    Public Function DecodificarWindows1252QuotedPrintable(ByVal texto As String) As String
        Dim datosByte As Byte() = Encoding.Default.GetBytes(DecodificarQuotedPrintable(texto))
        Dim codificador As Encoding = Encoding.GetEncoding("WINDOWS-1252")
        Dim caracteres = codificador.GetChars(datosByte)
        Return New String(caracteres)
    End Function
    ''' <summary>
    ''' Toma el string codificado en Windows-1252 base64 (=?WINDOWS-1252?B?) y lo
    ''' transforma a un string legible
    ''' </summary>
    ''' <param name="texto">Texto Codificado en Windows-1252 base64</param>
    ''' <returns>Texto decodificado</returns>
    ''' <remarks></remarks>
    Public Function DecodificarWindows1252Base64(ByVal texto As String) As String
        Dim datosByte As Byte() = DecodificarBase64(texto)
        Dim codificador As Encoding = Encoding.GetEncoding("WINDOWS-1252")
        Dim caracteres = codificador.GetChars(datosByte)
        Return New String(caracteres)
    End Function
    ''' <summary>
    ''' Toma el string codificado en ISO-8859-1 base64 (=?ISO-8859-1?B?) y lo
    ''' transforma a un string legible
    ''' </summary>
    ''' <param name="texto">Texto Codificado en ISO-8859-1 base64</param>
    ''' <returns>Texto decodificado</returns>
    ''' <remarks></remarks>
    Public Function DecodificarISOBase64(ByVal texto As String) As String
        Dim datosByte As Byte() = DecodificarBase64(texto)
        Dim codificador As Encoding = Encoding.GetEncoding("ISO-8859-1")
        Dim caracteres = codificador.GetChars(datosByte)
        Return New String(caracteres)
    End Function
    ''' <summary>
    ''' Toma el string codificado en UTF8 base64 (=?UTF-8?B?) y lo
    ''' transforma a un string legible
    ''' </summary>
    ''' <param name="texto">Texto codificado en UTF8 base64</param>
    ''' <returns>Texto decodificado</returns>
    ''' <remarks></remarks>
    Public Function DecodificarUTF8Base64(ByVal texto As String) As String
        Dim datosByte As Byte()
        datosByte = DecodificarBase64(texto)
        Dim codificador As Encoding = New UTF8Encoding()
        Dim caracteres = codificador.GetChars(datosByte)
        Return New String(caracteres)
    End Function
    ''' <summary>
    ''' Toma un string codificado desde base64 y lo decodifica
    ''' </summary>
    ''' <param name="base64">Texto codificado en base64</param>
    ''' <returns>Texto decodificado</returns>
    ''' <remarks></remarks>
    Public Function DecodificarBase64(ByVal base64 As String) As Byte()
        If base64 Is Nothing Then Throw New ArgumentNullException("base64")
        Return Convert.FromBase64String(base64)
    End Function
    ''' <summary>
    ''' Toma un string codificado en UTF8 Quoted-Printable (=?UTF-8?Q?)
    ''' y lo tranforma a un string legible
    ''' </summary>
    ''' <param name="texto">Texto codificado en UTF8 Quoted-Printable</param>
    ''' <returns>Texto decodificado</returns>
    ''' <remarks></remarks>
    Public Function DecodificarUTF8QuotedPrintable(ByVal texto As String) As String
        Dim datosByte As Byte()
        datosByte = Encoding.Default.GetBytes(DecodificarQuotedPrintable(texto))
        Dim codificador As Encoding = New UTF8Encoding()
        Dim caracteres = codificador.GetChars(datosByte)
        Return New String(caracteres)
    End Function
    ''' <summary>
    ''' Toma un string codificado en ISO-8859-1 Quoted-Printable (=?iso-8859-1?Q?) y
    ''' lo transforma a un string legible
    ''' </summary>
    ''' <param name="texto">Texto codificado en ISO-8859-1 Quoted-Printable</param>
    ''' <returns>Texto decodificado</returns>
    ''' <remarks></remarks>
    Public Function DecodificarIsoQuotedPrintable(ByVal texto As String) As String
        Return DecodificarQuotedPrintable(texto)
    End Function
    ''' <summary>
    ''' Toma una cadena de caracteres Quoted-Printable y los decodifica a un string legible
    ''' </summary>
    ''' <param name="CaracteresCodificados">Cadena de caracteres a transformar(facilmente puede ser un String)</param>
    ''' <returns>Cadena Decodificada</returns>
    ''' <remarks></remarks>
    Public Function DecodificarQuotedPrintable(ByRef CaracteresCodificados As Char()) As String
        Dim StringDecodificado As New StringBuilder
        Dim Contador As Integer = (CaracteresCodificados.Length - 1)
        Dim indice As Integer = 0
        Do While (indice <= Contador)
            If (StringType.StrCmp(StringType.FromChar(CaracteresCodificados(indice)), "=", False) = 0) Then
                Dim palabras As String
                If (StringType.StrCmp(StringType.FromChar(CaracteresCodificados((indice + 1))), "0", False) = 0) Then
                    palabras = StringType.FromChar(CaracteresCodificados((indice + 2)))
                Else
                    palabras = (StringType.FromChar(CaracteresCodificados((indice + 1))) & StringType.FromChar(CaracteresCodificados((indice + 2))))
                End If
                Dim NuevoContador As Integer = CInt(Math.Round(Conversion.Val(("&H" & palabras))))
                If (StringType.StrCmp(palabras, Conversion.Hex(NuevoContador), False) = 0) Then
                    StringDecodificado.Append(Strings.Chr(NuevoContador))
                    indice = (indice + 2)
                Else
                    StringDecodificado.Append(CaracteresCodificados(indice))
                End If
            Else
                StringDecodificado.Append(CaracteresCodificados(indice))
            End If
            indice += 1
        Loop
        Return StringDecodificado.ToString()
    End Function
End Class


And I called from VB6 like this

VB
Dim asd As BibliotecaFuncional.Lector
    Set asd = New BibliotecaFuncional.Lector
    Text1.Text = asd.DecodificarFraseCompleta(Text1.Text)


For this case BibliotecaFuncional is the name of the dll, Lector is the COM class in the dll and DeocodificarFraseCompleta() is a Function in Lector


that is the code used to create the dll in VB9 adding some functions made it by me, the check of "register for COM interop" is checked and is visible on COM

As additional data, I tested with simple dll and continues to send the error of automation, according to Internet I should use gacutil.exe ,but the target computer don't have it


Please help!
Posted
Updated 7-Jul-11 5:12am
v5
Comments
[no name] 5-Jul-11 0:38am    
does MS support upward comatibilty..

1 solution

You have to register the .DLL on the machine using REGASM. RegSvr32 doe not work on .NET COM-exposed .DLL's. You cannot use the .tlb file directly without the .DLL being registered.
 
Share this answer
 
Comments
pepito del puerto 5-Jul-11 17:49pm    
I register it but now i got this runtime errorError -2146232576 (80131700)

Automatization error help please
Dave Kreskowiak 5-Jul-11 18:18pm    
If the target machine has the version of the .NET Framework that you developed the .DLL against installed, you've got other problems in your code. What those are, we can't say. But, if you developed the .DLL against .NET 2.0, .NET 2.0 must be installed on the target machine.
pepito del puerto 6-Jul-11 9:40am    
The target machine have Framework 4 so i don't see the problem there, I make an update on the question, thanks for the patience
Dave Kreskowiak 6-Jul-11 18:52pm    
You code snippet isn't complete. You've got a MyBase.New call, but the your class isn't inheriting from anything that we can see. If this is indeed the full class declaration, it's missing information and could be the cause of your problem.
pepito del puerto 7-Jul-11 9:26am    
Now the code snippet is complete please help

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900