C/Visual C - Ejecutar codigo c++ desde VB 6.0

 
Vista:

Ejecutar codigo c++ desde VB 6.0

Publicado por Carlos (4 intervenciones) el 04/11/2005 16:21:37
Hola a tod@s:

Tengo un problema muy serio. Por una serie de requerimientos de una aplicacion q tengo q hacer, me he visto obligado a realizar una parte del proceso de mi aplicacion en Visual C++.
Tengo otra parte de este proceso q se hace en VB 6.0.

Pues bien, necesitaria saber como poder realizar la llamada al código c++ (para q realizara su tarea) y el array de datos q tengo en c++ (q es como resultado del proceso) devolverlo a la aplicacion Vb6.
Todo esto deberia de ser transparente para el usuario.

Muchas gracias por la ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ejecutar codigo c++ desde VB 6.0

Publicado por fernando.gomez (1604 intervenciones) el 05/11/2005 04:48:39
Sugerencia: busca en este mismo foro. He contestado alrededor de 5! (cinco factorial) preguntas al respecto. Si después de leerlas tienes dudas, escríbeme. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ejecutar codigo c++ desde VB 6.0

Publicado por Carlos (4 intervenciones) el 08/11/2005 16:29:10
Ya tengo resuelto el problema q me ocupaba desde hace un par de dias, es mediante una DLL creada desde Visual C++ e invocando las funciones de q se encuentran dentro de esa DLL.
Ahora el problema q me asalta es q no se pasar un String desde C++ (a traves de esa DLL) a VB6

Código VB6:

-- Llamada de la función:
retorno = DLLdevolverNombre(i, MyArrayNombre(i))
*MyArrayNombre(i) es un array de String
-- Declaración de la función:
Public Declare Function DLLdevolverNombre Lib "mutacion2.dll" (ByVal i As Long, ByVal nom As String) As Long

Código C++:

int FAR PASCAL DLLdevolverNombre (int i, char *nom)
{
nom = mi_mutacion.DevolverNombre(i);
return strlen(nom);
}

char* CMutacion::DevolverNombre (int i)
{
return a_mutacion[i].nombre;
}

*a_mutacion[i] es un array de objetos y uno de los elementos de ese objeto es el nombre.
struct dato {
int num1;
int num2;
char nombre[7];
int intensidad;
int fondo;
} a_mutacion[4608];

A ver si me podeis ayudar, muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ejecutar codigo c++ desde VB 6.0

Publicado por fernando.gomez (1604 intervenciones) el 08/11/2005 20:22:12
Ok, el problema es el siguiente. Actualmente, los "strings" de C/C++ son arrays de caracteres, y éstos terminan en caracter nulo. Pues bién, hace algunas lunas (muchísimas) Microsoft ideó un tipo de cadena de texto que pudiese contener caracteres nulos. Esto lo requería para el desarrollo de OLE, allá por 1994. Por ello, en Windows existe el tipo de dato llamado BSTR, que puede contener un caracter nulo en medio, y finaliza con dos caracteres nulos.

Como esto fué desarrollado para OLE, que después pasaría a ser COM/ActiveX, esta BSTR se incorporó a COM. Y pues resulta que cuando trabajas en VB, TODO son componentes COM, aunque la gestión la hace VB por detrás (por ello es que VB es ineficiente y si uno no tiene cuidado, lento). Así pués, el tipo de dato String es en realidad el BSTR.

Evidentemente, lo que tendrías que hacer es que en C++ deberías emplear BSTR* en lugar de char*. Pero cuidado, porque el empleo de BSTRs es complicado y te puede ocasionar muchas fugas de memoria. No puedes copiar directamente un BSTR, tienes que emplear las funciones SysAllocString y SysFreeString. Si no mal recuerdo, la clase CString de MFC provee algún manejo sobre BSTR, y ATL incorpora la clase bstr_t que te ayudará mucho.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ejecutar codigo c++ desde VB 6.0

Publicado por Carlos (4 intervenciones) el 11/11/2005 12:37:52
Bueno Fernando, muchas gracias por decirme lo del tipo BSTR, la verdad q por fin he conseguido trasladar las cadenas de caracteres de la DLL al VB.
La verdad q he tenido q hacer una serie de cambios, xq al final no lo paso como BSTR* sino como BSTR y la cadena q me devolvia a VB era por ejemplo, si la cadena inicial era "carlos", lo q aparecia en VB era "c[]a[]r[]l[]o[]s[]" con lo q he tenido q hacer un minitratamiento de las cadenas para eliminar dicho cuadradito (q sera un caracter basura).
En fin q da= , q muchas gracias por la ayuda presatada.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar