Problema con DLL, hecha en Visual C++

11/11/2003 - 22:14 por Jorwin | Informe spam
Hola,
Primero que nada quiere que me disculpen por tantas
preguntas en tampoco tiempo lo que pasa es que soy nuevo
en este lenguaje, bueno al grano, tengo una dll
desarrollada en visual c++, dicha dll, cuando la ejecuto
desde visual fox pro o desde visual basic, me genera un
error de memoria, al momento de yo ejecutar dicha dll, no
me genera ningun error, el problema esta cuando esta dll
la ejecuto en varios procedimientos o muy seguido me
arroja un error que dice que no puede escribir en la
memoria, y se sale de la aplicacion, ahora bien alguein me
podria explicar porque ocurre esto, porque la verdad no
entiendo nada.
Sera que al momento de crear la dll me falta alguna opcion
la verdad no se.
bueno aqui les dejo algo de mi dll
char* prueba(CString valor)
{
CString x;
//realizo una serie de operaciones to//
return _strdup((char*)(LPCTSTR)x);
};
la mayoria de mis funciones estan de esa forma me
devuelven un valor char*

Bueno Espero me puedan ayudar y disculpen tanta molestia
de mi parte.

Jorwin Cumare.

Preguntas similare

Leer las respuestas

#1 Javier Ariza Ayuso
12/11/2003 - 08:56 | Informe spam
Hola:

Tal y como has posteado el trozo de código es normal que te de problemas de
memoria

Estás devolviendo un string declarado dentro de la función; al salir de la
función prueba() el valor de x desaparecerá de la memoria, con lo que la
aplicación que recibe el valor devuelto char* no verá nada ahí o, a lo sumo,
lo verá corrupto.

Si lo que pretendes hacer en la función prueba es obtener un char* a partir
de un CString, tienes dos opciones: una de ellas es devolver char*
reservando dentro memoria para éste con malloc(), con lo que deberás hacer
otra función delntro de la misma dll opuesta a prueba dentro del cual hagas
free(); La otra opción es pasar la variable char* a prueba por referencia,
habiendo reservado ya memoria previamente. Esta es la opción que te
recomiendo:

DLL:

void prueba(char* pcad, CString valor) {
CString x;

// .. //

strcpy(pcad, x); // CString hace un casting automáticamente a char* y
copia la cadena a pcad

return;
}

en la APLI:

main() {
CString valor_cad;
char cadena[NNN]; // o bien char*
cadena=(char*)malloc(sizeof(char)*NNN);
..
prueba(cadena,valor_cad);
..
//Si se hizo malloc a cadena, hacer free(cadena);
..
}


Saludos.

"Jorwin" escribió en el mensaje
news:10dc01c3a898$dce02bc0$
Hola,
Primero que nada quiere que me disculpen por tantas
preguntas en tampoco tiempo lo que pasa es que soy nuevo
en este lenguaje, bueno al grano, tengo una dll
desarrollada en visual c++, dicha dll, cuando la ejecuto
desde visual fox pro o desde visual basic, me genera un
error de memoria, al momento de yo ejecutar dicha dll, no
me genera ningun error, el problema esta cuando esta dll
la ejecuto en varios procedimientos o muy seguido me
arroja un error que dice que no puede escribir en la
memoria, y se sale de la aplicacion, ahora bien alguein me
podria explicar porque ocurre esto, porque la verdad no
entiendo nada.
Sera que al momento de crear la dll me falta alguna opcion
la verdad no se.
bueno aqui les dejo algo de mi dll
char* prueba(CString valor)
{
CString x;
//realizo una serie de operaciones to//
return _strdup((char*)(LPCTSTR)x);
};
la mayoria de mis funciones estan de esa forma me
devuelven un valor char*

Bueno Espero me puedan ayudar y disculpen tanta molestia
de mi parte.

Jorwin Cumare.
Respuesta Responder a este mensaje
#2 Jorwin
12/11/2003 - 21:08 | Informe spam
Hola Javier, lo que me explicaste me funciono muy bien,
pero hay un pequeño problema solo me funciona desde el
mismo visual c++, y a mi no me sirve que funcione solo en
vc++, fijate bien desde vc++ me corre todo bien, y no hay
ningun tipo de problema el proble esta cuando ejecuto la
dll que he creado desde otro programa de desarrollo, en
este caso lo utilizo desde visual fox pro y la variable
que le paso como parametro para que me devuelva un valor
no me devuelve nada, ejemplo
DLL
void prueba(char* &retorno,CString cadena)
{
/*****/
retorno = "Valor Retornado";
}//esto me corre bien en visual c++ pero en otro lenguaje
la dll no me devuelve absolutamente nada

Mi aplicacion(Lenguaje de Programacion Visual Fox Pro 7.0)
Public valor
valor = ""
DECLARE prueba IN "mylibreria.dll" string @valor,string
cadena
prueba(@valor,"Prueba de algo")
////
y aqui cuando reviso el valor de 'valor', no tiene nada,
alguna otra idea del porque me esta pasando esto???

Bueno Muchas Gracias y de verda mil disculpas
Respuesta Responder a este mensaje
#3 Javier Ariza Ayuso
13/11/2003 - 08:49 | Informe spam
Vaya, pues siento no poder ayudarte pues... del Visual Fox ese ya no
controlo... lo único decirte que compruebes bien que las convenciones con
las que haces la llamada a la función sean las mismas en la dll y en la
apli.

Siento no poder ayudarte, a ver si se anima alguien a hacerlo.

Un saludo.


"Jorwin" escribió en el mensaje
news:03ab01c3a958$cc431370$
Hola Javier, lo que me explicaste me funciono muy bien,
pero hay un pequeño problema solo me funciona desde el
mismo visual c++, y a mi no me sirve que funcione solo en
vc++, fijate bien desde vc++ me corre todo bien, y no hay
ningun tipo de problema el proble esta cuando ejecuto la
dll que he creado desde otro programa de desarrollo, en
este caso lo utilizo desde visual fox pro y la variable
que le paso como parametro para que me devuelva un valor
no me devuelve nada, ejemplo
DLL
void prueba(char* &retorno,CString cadena)
{
/*****/
retorno = "Valor Retornado";
}//esto me corre bien en visual c++ pero en otro lenguaje
la dll no me devuelve absolutamente nada

Mi aplicacion(Lenguaje de Programacion Visual Fox Pro 7.0)
Public valor
valor = ""
DECLARE prueba IN "mylibreria.dll" string @valor,string
cadena
prueba(@valor,"Prueba de algo")
////
y aqui cuando reviso el valor de 'valor', no tiene nada,
alguna otra idea del porque me esta pasando esto???

Bueno Muchas Gracias y de verda mil disculpas
Respuesta Responder a este mensaje
#4 Jorwin
13/11/2003 - 18:43 | Informe spam
Hola javier, he notado que cuando el parametro que le paso
como valor por referencia es de tipo numerico bien sea int
o double, me trabaja sin nungun tipo de proble, el proble
surge cuando trabajo con datos de tipo string, alguna
suguerencia o porque puede pasar esto

///ejemplo con numerico
void prueba(int &valor)
{
valor = valor * 5
};///corre sin problema

///ejemplo con string o caracteres
void prueba(char* &valor)
{
valor = "Esto es una prueba"
};//esto no me arroja ningun resultado, en que estoy
fallando

Jorwin Cumare
Respuesta Responder a este mensaje
#5 KAKATUO
13/11/2003 - 19:42 | Informe spam
Jorwin,
En la ayuda de VC++ hay un artículo que puede ayudarte (por eso está en la
ayuda digo yo...) el susodicho es:
Ayuda://MSDN Visual Studio 6.0/Books/Hardcore Visual Basic/Chapter 2. The
Second level of Basic Enlightenment/Dealing with Strings/Getting Strings
from the Windows API.

También puedes mirar temas sobre BSTR strings.

Espero que te sirva.

"Jorwin" escribió en el mensaje
news:10dc01c3a898$dce02bc0$
Hola,
Primero que nada quiere que me disculpen por tantas
preguntas en tampoco tiempo lo que pasa es que soy nuevo
en este lenguaje, bueno al grano, tengo una dll
desarrollada en visual c++, dicha dll, cuando la ejecuto
desde visual fox pro o desde visual basic, me genera un
error de memoria, al momento de yo ejecutar dicha dll, no
me genera ningun error, el problema esta cuando esta dll
la ejecuto en varios procedimientos o muy seguido me
arroja un error que dice que no puede escribir en la
memoria, y se sale de la aplicacion, ahora bien alguein me
podria explicar porque ocurre esto, porque la verdad no
entiendo nada.
Sera que al momento de crear la dll me falta alguna opcion
la verdad no se.
bueno aqui les dejo algo de mi dll
char* prueba(CString valor)
{
CString x;
//realizo una serie de operaciones to//
return _strdup((char*)(LPCTSTR)x);
};
la mayoria de mis funciones estan de esa forma me
devuelven un valor char*

Bueno Espero me puedan ayudar y disculpen tanta molestia
de mi parte.

Jorwin Cumare.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida