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"
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
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!