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
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
//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
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
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.
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
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.
CitarPrivate 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í:
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:
- Declaring a DLL Procedure | MSDN (https://msdn.microsoft.com/en-us/library/aa716201(v=vs.60).aspx)
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.