Problema Dll C++ DevC++ y Visual Basic 6

Iniciado por erikcmauricio, 6 Diciembre 2017, 22:24 PM

0 Miembros y 1 Visitante están viendo este tema.

erikcmauricio

Buenas tardes gente....

Necesito pasar una cadena de texto de Visual Basic 6 a una Dll de DevC++ y mostrar un mensaje de la DLL

Tengo entendido que VB6 usa Unicode y DevC++ Ansi.... y no encuentro como convertirlo....

El código de la Dll es

en el .CPP

Código (cpp) [Seleccionar]

extern "C" __declspec( dllexport ) __stdcall void Mensaje(char Titulo[], char* Mensaje)
//extern "C" __declspec( dllexport ) __stdcall void Mensaje(char *Titulo, char &Mensaje)
//extern "C" __declspec( dllexport ) __stdcall void Mensaje(const char *Titulo, char* Mensaje)
//extern "C" __declspec( dllexport ) __stdcall void Mensaje(const char Titulo, char* Mensaje)
//extern "C" __declspec( dllexport ) __stdcall void Mensaje(LPCTSTR Titulo, char* Mensaje)
//extern "C" __declspec( dllexport ) __stdcall void Mensaje(TCHAR *Titulo, char* Mensaje)
//extern "C" __declspec( dllexport ) __stdcall void Mensaje(unsigned char Titulo, char* Mensaje)
{
       /*char *Convertir(char cad[])
       {
            int i;
            for ( i = 0 ; cad[i] != '\0' ; i++ )
            if( i == 0 || cad[i-1]==' ' || cad[i+1]== ' ' || cad[i+1]=='\0')
            if(cad[i] >= 'a' && cad[i] <= 'z') cad[i] -= 32;
            return cad;
       }
       
       Convertir(Titulo);
       Convertir(Mensaje);*/
       
       //convertir char* a LPCTSTR
       //LPCTSTR stringT = Titulo;

       //convertir char* a LPCSTR
       //LPCTSTR stringT;// = Titulo;
       //CString stringT;
       //TCHAR stringT;
       //t_char stringT[];
       //stringT = Titulo;
       
       //LPCTSTR stringM;// (Mensaje);
       //char stringM[54];
       //stringM = Mensaje;
       
       //int MAX_PATH;
       //MAX_PATH = 200;
       //char szANSIString [MAX_PATH];
       /*WideCharToMultiByte (CP_ACP, // página de códigos ANSI
       WC_COMPOSITECHECK, // Verificar caracteres acentuados
       //wszUNICODEString, // Cadena Unicode de origen
       Titulo,
       -1, // -1 significa que la cadena tiene terminación cero
       //szANSIString, // cadena de caracteres de destino
       stringT,
       //sizeof (szANSIString), // Tamaño del búfer
       sizeof (stringT),
       NULL, // Sin carácter predeterminado
       TRUE);  // No me importa esta bandera
       */
       //MessageBox(NULL, Titulo.c_str(), stringM, MB_ICONINFORMATION);
       //MessageBoxA(NULL, stringT, stringM, MB_ICONINFORMATION);
       //MessageBox(NULL, stringT, Mensaje, MB_ICONINFORMATION);
       MessageBox(NULL, Titulo, Mensaje, MB_ICONINFORMATION);
}


En el .H
Código (cpp) [Seleccionar]

//extern "C" __declspec( dllexport ) __stdcall void Mensaje(char* Titulo, char* Mensaje);
extern "C" __declspec( dllexport ) __stdcall void Mensaje(char Titulo[], char* Mensaje);
//extern "C" __declspec( dllexport ) __stdcall void Mensaje(LPCSTR Titulo, char* Mensaje);
//extern "C" __declspec( dllexport ) __stdcall void Mensaje(char *Titulo, char &Mensaje);
//extern "C" __declspec( dllexport ) __stdcall void Mensaje(const char Titulo, char* Mensaje);
//extern "C" __declspec( dllexport ) __stdcall void Mensaje(LPCTSTR Titulo, char* Mensaje);
//extern "C" __declspec( dllexport ) __stdcall void Mensaje(TCHAR *Titulo, char* Mensaje);
//extern "C" __declspec( dllexport ) __stdcall void Mensaje(unsigned char Titulo, char* Mensaje);


En VB6

Código (vb) [Seleccionar]

En VB6

Private Declare Sub Mensaje Lib "dll.dll" (Titulo As String, Mensaje As String)

Private Sub Command1_Click()
       Mensaje "Este es el título", "Este es el mensaje"
End Sub


Al correr el ejecutable de VB6 me tira un mensaje con símbolos....

Gracias de antemano

Serapis

VB6 puede operar con dos tipos de cadenas.
1 byte por carácter y con 2 bytes por carácter,  y para pasar de una a otras se utiliza la función Strconv (o bien hacerlo manualmente). Aparte las cadenas de longitud fija herencia de Basic más antiguos (QuickBasic)...
Básicamente si usa dos bytes por carácter, el segundo (los impares) debe ser un null (byte 0) y la cadena de texto siempre debe acabar en un null (el último byte par).

Cuando se usa en Dll, el error más común suele aparecer porque se considere o no el carácter de fin de cadena (null), o bien porque no se pase correctamente el puntero de la cadena.

Cuando proceda (o inténtalo y ver si así se resuelve tu problema), pasa un array de bytes. VB6 convierte automáticamente un array de bytes en cadena así como una cadena en un array de bytes, cuando se haga dicha asignación.
Código (vb) [Seleccionar]

Private Sub Form_Load()
    Dim miArray() As Byte
    Dim texto As String, otroTexto As String
    Dim k As Long

    texto = "ejemplo"
    miArray = texto

    For k = 0 To UBound(miArray)
        MsgBox Chr$(miArray(k))
    Next
    otroTexto = miArray
    MsgBox otroTexto
End Sub

Salida:
E
null
j
null
e
null
m
null
p
null
l
null
o
null



Técnicamente un "string" en VB6 es un "BStr" de C.
https://msdn.microsoft.com/es-es/library/windows/desktop/ms221069(v=vs.85).aspx

Eleкtro

CitarTengo entendido que VB6 usa Unicode y DevC++ Ansi.... y no encuentro como convertirlo....

Visual Basic hace la conversión automática a Unicode y ANSI cuando es requerido. Ese no es el problema.

Citar
Código (vb) [Seleccionar]
Private Declare Sub Mensaje Lib "dll.dll" (Titulo As String, Mensaje As String)

La conversión de tipos parece correcta, en teoría deberías poder usar el datatype String en Visual Basic para char* y char [] (Array).

Tal vez el problema por el cual te salta un error nada mas iniciar el executable pueda ser debido a que ambos parámetros de tu función se están pasando por referencia en la declaración de Visual Basic (ya que por defecto en Visual Basic todos los parámetros se pasan por referencia a menos que utilices la palabra reservada ByVal), creo que el problema podría estar en que el primer parámetro de la función debería pasarse por valor. Prueba así:

Código (vb) [Seleccionar]
Declare Sub NombrePúblico Lib "NombreLibrería.dll" Alias "Mensaje" (ByVal titulo As String, ByRef mensaje As String)

Aquí puedes encontrar información y ejemplos de interés:

PD: no programo en VB6 ni en C/C++, solo me limito a intentar resolver el problema haciendo suposiciones en base a las características de cada lenguaje.

Saludos.