PREGUNTAS CONTESTADAS - C/Visual C

 Hay un total de 745 Preguntas.<<  >> 

    Pregunta:  247 - CREAR UNA DLL EN VC++ PARA VB 4.0
Autor:  Gabriel
Necesito ayuda Urgente: Estoy creando una DLL en Visual C++ 1.5 para ser utilizada desde Visual Basic 4.0(Estoy trabajando en 16 bits con Windows 95). Una de las funciones que he creado recibe una cadena y devuelve otra cadena, la declaracion del parámetro es la siguiente:
NPSTR CALLBACK __export AVISO ( NPSTR cadena)
{
....
}
Tambien he probada con LPSTR y char *

En Visual Basic hago la declaración utilizando como parámetro ByVal cadena As String sin embargo la función de VC++ no recibe ninguna cadena y cuando ejecuto el programa VB me da un error diciendo que los tipos no coinciden.
¿Cual es la declaración declaración correcta para poder recibir un String de Visual Basic y devolver otro?
Cuando paso y devuelvo enteros no hay ningún problema.
También quisiera saber cual seria la forma de pasar un array.
Desde ya muchas gracias

  Respuesta:  Isaac Valentin
Hola Gabriel:

Tengo exáctamente el mismo problema que tú. Yo he conseguido resolverlo de una forma 'poco elegante'

Mi función en C++ es del estilo
int Venta (char* entrada, char* salida);

y en VisualBasic declaro la función Venta así:
Private Declare Function Venta Lib "SmpaItf.dll" (ByVal importe As String, ByVal buffer As String) As Integer

en VB creo un string, que es donde en realidad voy a recibir los datos del VC

dim buffer as string
dim status as integer

buffer = Space(1024)
status = Venta("12.00", buffer)
msgbox buffer

La función en C lo que hace es "rellenar" el parámetro char* salida y, en visual basic, después de la llamada a la función Venta, la variable buffer contiene lo que la función en C ha puesto.

No me gusta, aunque funciona, creo que es una forma 'guarra' de hacerlo y además nos obliga a definir el tamaño de la respuesta desde el Visual Basic ..... pero es la única forma en que he podido implementarlo ... si al final tu has conseguido una forma mejor ... por favor cuentamela.

Thanks
  Respuesta:  Miguel Sepulveda
Prueba a usar en VB ByRef y en C++ usa char *.
Espero que te sirva para solucionar tu problema. Un saludo.

    Pregunta:  263 - CÓMO GENERO UNA DLL EN VISUAL C++ PARA VBASIC 5.0
Autor:  Raúl
Quiero hacer una función en Visual C++ y compilarla como DLL para poder ejecutarla desde Visual Basic 3.0 o 5.0. Necesitaría:
¿Saber cómo declararla, definirla y demás, tanto en Visual C++ como en Visual Basic?
De ser posible, si me puedes escribir unas líneas de código de ejemplo estaré muy agradecido.
  Respuesta:  Juan José Rodríguez
Busca información sobre BSTR, USES_CONVERSION, W2T, A2T, T2BSTR en MSDN.

Y con eso creo que tendrías solucionado el manejo de strings de Visual Basic a Visual C++ y viceversa.
  Respuesta:  Miguel Sepulveda
En C++ tienes que abrir un proyecto nuevo como Win32 Dynamic-Link Library con el nombre por ejemplo "PuebasDll".
La cabecera de la función sera de la siguiente forma:
tipo-retorno WINAPI nombre-funcion(parámetros) por ejemplo:
short  WINAPI sumar(short a, short b)
{
return (a+b);
}
En VB tienes que introducir una linea con lo siguiente:
Declare Funtion sumar Lib "PruebasDll.dll" (ByVal a As Integer, ByVal b As Integer) As Integer.
Dim a As Integer
Dim b As Integer
Dim c As Integer

a = 3
b = 7
c = sumar(a, b)

Espero que te sirva. Un saludo.
  Respuesta:  Juan
Consulta la direccion

http://web.jet.es/pmaicas/articulo/gifdll.html

Apenas la encontre pero yo creo que si biene mas o menos explicada

    Pregunta:  275 - ARCHIVOS EN C
Autor:  Andrés
Les escribo porque tengo un problema. Quiero hacer una función para calcular el tamaño de un archivo. Yo escribí una que funciona muy bien con los archivos de texto pero no con un ejecutable. Quisiera saber que está mal.
Esta es la función:
long FileSize(FILE *file)
{
long pos_actual, tam;
pos_actual = ftell(file);
fseek(file, 0L, SEEK_END);
tam = ftell(file);
fseek(file, pos_actual, SEEK_SET); /* vuelvo a poner el puntero donde estaba antes */
return tam;
}
  Respuesta:  Julio Alejandro
Hola, lamento no contenstarte tu pregunta, pero si de algo te sirve, he provado tu función en Turbo C++ 3.0 y funciona perfectamente bien, incluso con archivos ejecutables, te da exactamente el mismo valor en bytes que el que te indica un DIR del DOS, solo te puedo indicar que abri el archivo con FOPEN y de solo lectura, además imprimí el valor de regreso con un sencillo PRINTF(....%ld ....).  Checá bien :-)  Saludos.
  Respuesta:  Jose
Este pequeño programa te dice cual es la longitud en bytes de un archivo, en este caso el  nombre del archivo es netlog.txt, situado en el directorio c:\
#include
#include

main()
{
FILE *pf;
long  pos_fin=0;
clrscr();

/* apertura del fichero */
if( (pf = fopen("c:\\netlog.txt","rb")) == NULL)
{
perror("Error en la apertura del fichero.");
exit(-1);
}

if (fseek(pf,0L, SEEK_END)) /* posiciona el puntero del fichero al final del mismo */
{
perror("Error.");
fclose(pf);
exit(-2);
}
pos_fin = ftell(pf); /* nos devuelve la posición del puntero del fichero*/

printf("Longitud: %ld",pos_fin);

fclose(pf);
}

  Respuesta:  Daniel Osuna
El problema no esta en esa función, sino en la forma en que abrís el stream:

si lo abres en modo "rt", o algo parecido con t (texto): "wt", "r+t", "a+t", etc, el programa trasladará los CTRL-Z como fines de archivo y por lo tanto en el primer cracter 26 que encuentres dentro de un archivo binario, interpretará que llego al final del mismo.
Debes abrir el stream con modo b (binario)

arch=fopen( nomarch, "rb" );

    Pregunta:  280 - USO DEL CONTROL MSCOMM32.OCX
Autor:  Javier
Necesito saber como programar el puerto serial mediante Visual C++ 5.0, utilizando el control MSCOMM32.OCX de Microsoft. Tengo entendido que tiene muchas funciones y ya manejo algunas de ellas, el caso es que las dos principales envio y recepción, funcionan con un tipo de datos varian y en C++ nunca he manejado tal cosa, no se deja convertir a otro tipo. Mejor dicho no se nada acerca de el.
Espero la respuesta y colaboración.
  Respuesta:  Carlos Israel Alemán
Para el dato variant puedes utilizar una estructura que contenga un int y una union, el int es para codificar el tipo de dato que contenga la estructura, y la union consta de todos los tipos de datos disponibles. De sta forma puedes trabajar con tipos de datos variant.
  Respuesta:  Alonso Salazar
Por la longitud de la respuesta de Alonso Salazar, la hemos colocado en el archivo resp280.txt.

    Pregunta:  300 - FUNCIÓN KEEP DE BORLAND C++
Autor:  Luis
Agradeceria cualquier tipo de información sobre la función KEEP para dejar un programa residente.
GRACIAS
  Respuesta:  Herold Leiva M.
Por la largada de la respuesta, la hemos colocado en el archivo resp300.txt

    Pregunta:  316 - TURBO C A TURBO PASCAL
Autor:  Armando
Deseo conocer alguna manera de pasar un programa hecho en Turbo C a el codigo que generaria en Turbo Pascal, asi de paso pueden darme una solucion al hecho de que los ejecutables de Pascal sean mas pequeños que los de un programa hecho en C.
  Respuesta:  sinapse
Yo me baje un programa de internet que hacia eso, si te sirve, pon en google "ctopas.zip", que era el nombre. Pero no era gran cosa.
Si quisieras hacerte tu uno bueno, tendrias que hacerte un compilador, y eso tiene bastante miga (deberias hacer una tabla de simbolos,un analizador morfologico, uno sintactico, uno semantico y un generador de codigo, bastante chungo).
En cuanto a por que son menores los ejecutables en Pascal es muy facil: en C los objetos se linkan con las librerias (stdio.h,stdlib.h,etc) ENTERAS, aunque solo uses unas pocas funciones de cada una. En Pascal los objetos solo se enlazan con las funciones necesarias de cada libreria.

Cualquier cosa, me escribes
  Respuesta:  JF VA
no existe en si un programa que te pase totalmente de un lemguaje a otro pero si se puede implementar uno que te cambie el nombre de siertas sentencias por ejemplo sustituir { por begin etc .
no tengo por el momento la bibliografia completa pero en el libro de: Programacion Avanzada en C viene una rutina que soluciona tu problema. nose mucho de C y tengo problemas con estructura de datos pero en lo que te pueda ayudar lo hare con gusto..
  Respuesta:  Jorge Vicente
No se como puedes convertir el código del Turbo C al del Turbo Pascal, estas planteando una cuestión harto complicada. Lo que si te puedo decir es la razón (al menos la que a mí siempre me explicaron, y es lógica por otra parte ) por la cual el código del Turbo C es mayor que el generado por el Turbo Pascal. El turbo C linka (o enlaza) una librería completa, independientemente de si utilizas todas o solo parte de las funciones que implementa. El Turbo Pascal, en cambio solo usa ciertas funciones enlazadas en el código. La función printf en C enlaza toda la librería estándar de entrada salida (encima dependiendo del modelo de memoria en la que estes compilando será mayor o menor), y el turbo pascal solamente la función write (o writeln) que es pequeñita. La única manera que veo de reducir "radicalmente" el tamaño generado del código es crearte tú propia función en ensamblador y si fuese solamente imprimir cosas en pantalla pues mediante una interrupción del DOS y listo, si no es una función sencilla el asunto es más complicado.

    Pregunta:  322 - PROBLEMAS CON LA MEMORIA EN C++
Autor:  Juan
Soy Argentino y medio bruto, y tengo un problema. Tengo que entregar un programa en la facultad a modo de trabajo practico y mi problema es que no puedo crear un vector o cualquier otra estructura de datos en forma dinamica con la cual pueda utilizar la memoria que necesito.
El Sistema Operativo que uso es Windows 95, el compilador que uso es Turbo C++ 3.0 de Borland.
El vector del que hablo debe guardar al menos 30000 estructuras que contengan un entero largo y una cadena de caracteres de 4 posiciones (char[4]). Agradeceria a todo el que me pueda responder esta pregunta...
  Respuesta:  Andres Manggini
Algo asi deberia funcionar:
struct A
{
long l;
char c[4];
}

void main()
{
A pA;
pA = new A[30000];
}

Compilando en modo huge.
Ahi tienes un array de 30000 estructuras creado dinamicamente.
Cualquier cosa mandame un E-Mail

Saludos desde Argentina.

  Respuesta:  Daniel Osuna
Aqui va una solución que emplea el API de windows:
struct A
{
long l;
char c[4];
}

HGLOBAL hpA;
struct A *pA;
HGLOBAL hpa

void main()
{
hpa = GlobalAlloc( GPTR, 30000);
pa=(struct A *pA)GlobalLock(hpa);
}

Esta forma funcionará solo porque el numero de bytes de cada elemento es divisor entero de 65536 que es el tamaño de un segmento de DOS. Si no fuera así deberías rellenar al estructura hasta el próximo divisor entero.
pe.
struct B{
char dato1[6];
long dato2;
char dato3;
}
debeías rellenarlo como:
struct B{
char dato1[6];
long dato2;
char dato3;
char relleno[5];
}

    Pregunta:  378 - PROBLEMA AL RESERVAR MEMORIA
Autor:  Eider J. Falla A.
Hola,
me esperanzo en ustedes para solucionar un gran dilema, el problema es de C/C++, y se basa principalmente en un proyecto de programación sobre las matriculas para estudiantes de una institución, el sistema maneja basicamente 3 conceptos, manejo de archivos, manejo de listas dinamicas doblemente enlazadas, y el manejo del modo grafico del C/C++ y su biblioteca , estamos trabajando en un PC de 166Mhz, a 16MB de RAM, y un espacio de disco bastante corto, 8-10MB, trabajamos el modo corto de manejo de memoria del compilador, (pero ya tratamos los otros modos y fue peor), el problema radica en el manejo de la lista para cargar la información de los archivos, la cual ha creado una total incompatibilidad con el modo grafico antes mencionado...

en la lista manejamos C++, para ser usada como un objeto, y reservamos memoria con el argumento new, al parecer este argumento, al ser expuesto en un ciclo, (al cargar la información de los archivos), y junto con el modo grafico, me pisa, por asi decirlo, o me separa y usa memoria que es exclusiva del sistema operativo (DOS 6.22), y me crea un desborde de pila en la memoria principal, lo cual no me explico al tener tanta memoria disponible, y esto ocurre con unas pocas veces de uso...

quisiera saber si alguna forma de direccionar el operador new o de manejarlo de tal forma que pueda ubicarme en memoria que no esta siendo usada, o tal vez deba quitar el manejo de listas... no se que pasa en realidad aqui, estamos utilizando el operador delete para liberar la memoria usada e incluso creamos una función llamada destruir() que me libera toda la lista, pero esto fue peor aun, no se si lo hicimos mal... ya que no somos muy buenos con el C++. ya que sus ayudas son horribles.

apreciaria cualquier ayuda... cualquier comentario... cualquier posible causa del error.. o cualquier posible solución.
Cordial Saludo,

  Respuesta:  Chuy Saenz
Primeramente un saludo,
no se pero se me ocurre utilizar un puntero tipo far que sirve para utlizar la memoria fuera de los 640kb co0nvancionales, con esto separa la memoria.
  Respuesta:  José Luis Torres Pantoja
Ante todo un saludo.
No se si ya resolverías tu problema, de no ser así ahi te va mi experiencia:

Tengo bastante tiempo manejando el C/C++ para DOS y nunca he tenido esos problemas, es más yo pienso que puede estar sucediendo alguno de estos casos:
1.- dejas algun archivo abierto y nunca lo cierras
2.- abres más de una vez un archivo sin cerrarlo.
3.- cierras un archivo que no ha sido habierto.
4.- cierras más de una vez un archivo.

incluso hasta puede ser tu rutina del ratón(si la utilizas):
1.- llamas a la rutina para mostrar el ratón dos veces
2.- llamas a la rutina de ocultar el ratón sin que éste esté visible.

Tal vez parezcan raras estas causas pero créeme que suele suceder que esto te cree problemas.

Si tu problema continúa no dudes en enviarme un mail
Hasta luego.
  Respuesta:  Endos
Por el gran tamaño de la respuesta, la hemos colocado en el archivo resp378.txt

    Pregunta:  395 - GRAFICOS EN C++ 3.0
Autor:  Eloy M. Silva Vásquez
como poder hacer una rutina de ingreso de numeros o caracteres en modo grafico, con la finalida de que si se ingresa un número, se grafique dicho dato. Ejemplo

graficar la función seno(nuemero), etc
y=sin(x) su grafica en una area determinada de la pantalla

  Respuesta:  DAVID PIVARAL
LA PREGUNTA NO ES MUY CLARA PERO SI LO QUE DESEAS ES INGRESAR UN DATO NUMERICO EN MODO GRAFICO, DEBERAS INGRESARLO COMO UNA CADENA Y LUEGO CONVERTIR ESTA AL VALOR NUMERICO USANDO LAS FUNCIONES 'ATOI', 'ATOL',ETC.
PERO SI LO QUE DESEAS ES GRAFICAR UNA FUNCION EL EL LIBRO 'BORLAND C' DE PAPPAS, PODRAS ENCONTRAR UNA RESPUESTA DETALLADA.
  Respuesta:  victor hugo perdomo
creo que tengo exactamente lo que necesitas, diseñe un programa que me muestra la funcion seno utilizando la "graphics.h" y haciendo unas modificaciiones muy simples podemos graficar cualquier otra funcion.Si deseas el codigo fuente mandame un correo y con gusto te lo enviare.
  Respuesta:  Eider
si lo que quieres es leer un numero en modo grafico la respuesta en el archivo resp395.txt

si lo que deseas es graficar un funcion matematica, esto es bastante sencillo si sabes cuales son las medidas de la pantalla en que trabajas, si por ejemplo estas usando el modo normal, es decir el driver VGA.BGI, entonces la pantalla sera de 640x480 pixeles, iniciando en 0, para todas las dos dimensiones, y si sabes esto, y sabes que puedes colocar un pixel con la funcion "putpixel(parametros)", (puedes buscarla en la ayuda del compilado en la libreria , entonces la funcion matematica sera bastante sencilla de graficar, incluso puedes adornarte haciendo una cudricula y demas, y calcular la mejor cuadricula para tu función, pero eso ya es matematico y no de programación...
espero te sirvan las funciones y la información

SUERTE...

  Respuesta:  CLAUDIO CASTILLO
Te cuento mi experiencia, lo que hice fue grabar mis fuentes de vb3 en modo texto, si te das cuenta los fuentes frm de vb5, son muy similares, lo unico que hacen referencia a distintos controles. Para empezar debes modificar los frm de vb3, y donde hagan referencia a la threed.vbx debes cambiarla por threed.ocx, y asi para para todo.

Nota: Debes considerar ademas que para algunos controles se crearon nuevas propiedades, por lo que yo hice un algoritmo que me incorporara las nuevas propiedades de acuerdo al objeto a actualizar, de no hacerlo se abriran los objetos pero no del tamaño ni posicion original. Suerte.

    Pregunta:  404 - BIOSCOM
Autor:  Juan Carlos
Estoy trabajando con BORLANDC (Version 3.0), para adquirir datos por puerto serial, Utilizo BIOSCOM. Yo me base en el ejemplo que trae el programa, pero el dato que el me arroja en la pantalla es un caracter (PUTCH), yo necesito convertir este dato a un numero flotante (he tratado con ATOF :conversion de string a flotante), pero he tenido problemas con el string y el apuntador. Si alguien me puede decir como lo convierto le agradeceria...

Tambien quisiera saber donde encuentro información sobre como adquirir datos en linea utilizando BORLAND C++ (No es un solo dato, sino unos datos que forman un grafico por ejemplo una señal de voltaje A.C)

  Respuesta:  David
char a; // Aqui esta el caracter recibido
float b; // Aqui vamos a dejar el caracter
b = (float)a;
Si utilizas atof() es para lo siguiente
char *a="100.55";
float b;
b = atof(a);

|<  <<  1 2 3 4 5 6 7 8 9 10 11  >>  >|