PREGUNTAS CONTESTADAS -

 Hay un total de 745 Preguntas.<<  >> 

    Pregunta:  15028 - CAMBIAR FECHA DIRECTORIO
Autor:  Wences Martin
¿ Como puedo cambiar la fecha de un directorio desde Windows98 con C ?
  Respuesta:  Ricardo Ortega
Para cambiar la fecha y hora de archivos y directorios (carpetas) se utiliza la misma función setfiletime,
o _dos_setfiletime
_dos_setfiledate
el nombre y el formato depende del compliador o si estás bajo dos o bajo windows, busca la documentación de cada compilador para Windows se puede buscar la API con el mismo nombre.
Si necesitas ejemplos, escríbeme.

    Pregunta:  15135 - CRAE DLL EN VISUAL C++ PARA ACUCOBOL
Autor:  Diego Muñoz
Hola a todos, tengo que generar una DLL en Visual C++ 6.0, para ser utilizada en un programa en ACUCOBOL.

Este programa, leerá un puerto de la PC, donde se alojara una placa con 16 entradas digitales y 16 salidas digitales.

Yo he hecho algunos programas en Visual C++, pero siempre como CONSOLE APPLICATION.

Les pido que me indiquen como crear una DLL. Yo para probarla haré un programa en Visual Basic 6.0, ya que es lo que mas domino.

La DLL, sera utilizada en ACUCOBOL como dije, pero en un programa que no hago yo sino un tercero.

Muchas gracias.
  Respuesta:  Fernando Gómez
Diego,

híjole, en la que te metiste, mano :D. Es un tanto laborioso, sobre todo si pretendes probarla en VB. Te voy a presentar dos panoramas: tu decides cuál emplear.

PRIMER PANORAMA: UNA DLL NORMALITA.

Primero, generas un proyecto. Luego, agregas tu función de inicio DllMain.

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

Quizás quieras saber el por qué fué llamada la librería. Entonces, añades una sentencia switch parecida a la siguiente:

switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
// Acciones
break;
case DLL_THREAD_ATTACH:
// Acciones
break;
case DLL_THREAD_DETACH:
// Acciones
break;
case DLL_PROCESS_DETACH:
// Acciones
break;
}

Generalmente, no necesitarás hacer más en esta función, pero dentro de ésta puedes iniciar variables globales, leer datos de disco, etc.

Luego, tendrás que hacer un archivo .DEF, en el que incluirás la declaración de tus funciones a exportar. Si suponemos que exportarás funciones que se llamen Func1, Func2, ..., FuncN, tu archivo DEF lucirá similar a lo que transcribo:

; El punto y coma sirve para hacer comentarios, como el // de C++
LIBRARY "TuLibreria.DLL"

EXPORTS
Func1 @1 PRIVATE
Func2 @2 PRIVATE
; ... demás funciones a exportar ...
FuncN @N PRIVATE

Finalmente, implementas tus funciones Func1, ..., FuncN. Con eso, tienes. Pero, para poderla probar en VB, acuérdate que necesitas accederla a través de la siguiente declaración:

[Public | Private] Declare Sub name Lib "libname" [Alias "aliasname"] [([arglist])]

Acuérdate que el Alias se emplea en caso de que alguna Func1, ..., FuncN tenga nombres cuyos identificadores sean inválidos en VB, pero válidos en C++ (como caracteres _ al inicio del identificador).

Ahora, para que VB reconozca de antemano las funciones de la librería, y para saber cuándo pasar argumentos String, Long, Float, etc, necesitas crear, a tu DLL, un archivo MSIDL (Microsoft Interface Definition Language). Este archivo lo único que hace es describir tus funciones. Puedes consultar el SDK para mayor información sobre sintaxis.

Esto debería bastar para la mayoría de los desarrolladores, pero para tí no. Y esto, porque mencionas que tu librería es para distribución, y que lo hace un tercero. El problema radica en lo siguiente. En el archivo DEF de tu librería, notaste que entre el nombre de tu función y la palabra PRIVATE hay un número ordinal: @1, ..., @N. Estos identificadores sirven para hacer un "mangle". Un mangle es un identificador que contiene un cifrado especial para evitar que se repitan funciones; algo así como un identificador único. El problema es que este mangle no es estándar, por lo que VC++ "manglea" las funciones de manera diferente a Turbo C++ o al compilador de IBM. Por lo tanto, si haces tu DLL en VC++, el desarrollador de ACUCOBOL tendrá que emplear VC++: si emplea Turbo C++, la libreria no le servirá.

Además de éste, hay otros problemas de "preformance", eficiencia en memoria, por lo cuál es inconveniente el empleo de las DLL sencillas, pero el punto anterior es el que más te afectaría. Y aquí es donde entra nuestro segundo panorama.

SEGUNDO PANORAMA: UN COMPONENTE COM (COMPONENT OBJECT MODEL)

Este es el más complicado, porque COM no es una tecnología sencilla. De hecho, no esperes, de antemano, que lo que transcriba abajo resolverá tu problema: es tan sólo una muestra de lo que tendrías que realizar.

El COM se basa en interfaces. En C++, una interfaz es una clase o estructura que contiene puros métodos virtualmente puros (abstractos), esto es, algo así:

class ICualquierInterfaz
{
public:
virtual void Metodo1(/* tus parametros*/) = 0;
};

Por supuesto, puedes emplear cualquier otro valor de retorno en vez de void. Para mayor comodidad, VC++ ha añadido la palabra interface como keyword, pero en realidad está definida como sigue:

#define interface struct

Struct, para que todos sus miembros sean public por default.

Para que una interfaz pueda ser implementada en un componente COM, hay que declarar los miembros como una llamada estándar (pascal):

virtual void __stdcall Metodo1(/* tus parametros*/) = 0;

Generalmente el valor de retorno es HRESULT, que indicará si hubo un error o no:

virtual HRESULT __stdcall Metodo1(/* tus parametros*/) = 0;

De hecho, un Runtime error en VB6 es precísamente una función que regresó un valor diferente de S_OK.

Ya que tienes una pequeña introducción, veamos qué deberías hacer para construir tu componente COM.

Primero, necesitas un Global Unique IDentifier: GUID para tus interfaces, y uno para tu Componente. Estas son de la siguiente forma:
{8C0AF616-CCD2-4c42-9EA5-B17E7AC6DD69}
y que lo genera GUIDGEN.EXE. Microsoft garantiza que el algoritmo empleado para generar este número garantiza, a su cez, que el número sea único.

Segundo, tus interfaces tienen que heredar de IUnknown, una interface que define tres métodos: AddRef, Release y QueryInterface. Las primeras dos funciones sirven para mantener una relación de cuántas instancias de un componente están actualmente cargadas en memoria. La tercera, busca la interfaz que corresponde al GUID (IID) que se pasa como parámetro y regresa, en otro parámetro, un puntero a ésta interfaz (en una nueva instancia).

Tercero, tendrías que exportar estas cuatro funciones:

DllCanUnloadNow @1 PRIVATE
DllGetClassObject @2 PRIVATE
DllRegisterServer @3 PRIVATE
DllUnregisterServer @4 PRIVATE

DllCanUnloadNow regresa S_OK si el número de instancias cargadas del componente es igual a cero y S_FALSE en caso contrario. Para ello, por supuesto, deberás llevar un control sobre estas variables.

DllRegisterServer registra en el Registry de Windows el GUID. DllUnregisterServer, elimina dicho registro. Esto es de suma importancia, ya que cuando un cliente manda llamar CoCreateInstance para crear el componente, dicha función (que pertenece, claro, al API de COM) busca en el registro que exista, y toma el AppPath de dónde se encuentra la librería DLL que contiene al componente.

De DllGetClassObject hablaremos en unos instantes.

El siguiente paso, es crear una clase que implemente las interfaces requeridas. A su vez, esta clase heredará tambien de IUnknown. Y aquí es donde definirás todos los métodos de las interfaces. Incluso, puedes agregar otros métodos auxiliares, así como variables de clase.

A continuación, necesitas crear una clase que se denomina Creación de factorías. El nombre es muy ad hoc, ya que es esta clase, que hereda de IClassFactory, y ésta a su vez de IUnknown, es la que va a instanciar el componente. Es decir, es la "fábrica que crea componentes". Normalmente, esto sucede en la función CreateInstance, que mandará llamar QueryInterface de la clase del componente. Este método decidirá, de acuerdo a los parámetros que reciba de entrada (el GUID de la interface que solicita el cliente) que QueryInterface llamar. Además, esta clase determinará si soporta Contenimiento y Agregación, que son métodos a través de los cuales COM soporta la "herencia" de componentes. Pero esto no nos incumbe de momento.

Ahora, ya que está todo listo, ¿cómo es que voy a saber qué interfaz me está pidiendo el cliente? ¡Pues claro! Como habrás adivinado, DllGetClassObject es la encargada de esto. Así, esta función funciona (valga la redundancia) como "puente" entre el cliente y el componente. Precísamente en DllGetClassObject, de acuerdo a su parámetro de entrada REFIID (que es un puntero a una estructura GUID que define la GUID de la interfaz buscada) creas un objeto de factoría de clase, en el cuál llamarás a CreateInstance, y que te devolverá el puntero a tu interfaz instanciada, si tiene éxito, claro.

Esto no es todo, por supuesto, pero una vez cubiertos estos pasos ya tienes un componente COM meramente funcional. Aunque hay clases predefinidas para otros aspectos del COM (como los antes mencionados Contenimiento y Agregación), y que también se tiene que implementar ciertos métodos para obtener Marshaling y hacer el componente accesible a través de una red, y que también se recomienda implementar IDispatch para no depender del archivo de definición de las interfaces, esto es lo mínimo que requieres.

Sin embargo, para probarlo desde VB ésto no es suficiente. VB, al igual que otros lenguajes como Java o Delphi, necesita saber la "descripción" de tu componente. Y para ello, necesitará un archivo MSIDL que lo describa.

TERCER PANORAMA: CORBA.

Aunque no te lo enuncié al principio, hay otra opción, pero como verás, es prácticamente igual que la segunda: CORBA. Esta tecnología es "la competencia de COM". Por ello, lo único que cambiaría sería la forma de hacer un componente, no el fondo. Ahora, CORBA tiene la desventaja (o ventaja, depende) de que no es de Microsoft, por lo que su futuro está prácticamente sentenciado. Por eso, cuando mencionaba "componente COM" hacía incapié en que era COM, ya que también existen componentes CORBA, aunque más escasos sobretodo en Windows.

En fin, espero haberte sido de ayuda. Como ves, las dos opciones tienen sus pros y contras. En lo personal, yo emplearía la segunda opción, ya que es más robusta que la primera. Pero dudo que tengas tiempo de aprender COM: es una tecnología complicada de asimilar. Si tienes dudas, contáctame.

Un saludo.
- Est solarus oth mithas -

    Pregunta:  15204 - CARGA DE ACTIVEX EN C++ BUILDER
Autor:  Alberto Ribagorda Martínez
Tengo un control ActiveX creado en C++ Builder a partir de un componente VCL. Mi problema es el siguiente: Tengo ciertos métodos que se tienen que realizar en el método Loaded del componente VCL, y que bajo este componente todo funciona perfectamente; el problema viene a la hora de generar el ActiveX, cuando se añade a un formulario el metodo Loaded se ejecuta en tiempo de diseño, y se vuelve a ejecutar cuando se ejecuta la aplicación que se está diseñando, dando un error debido a que la inicialización de mis metodos solo se deben hacer una vez. Muchas Gracias
  Respuesta:  Eduard Pascual Sáez
Hay un sistema muy simple para evitar que un proceso se ejecute más de una vez:

bool inicializado = false; //añade esta variable al control (ponla como private)
... //código
void loaded() { //ajusta el tipo de retorno y la lista de argumentos
if (inicializado) {
inicializado = true;
... //código de tu función
}
}

No es ninguna obra de arte, pero resuelve muchos problemas.
Espero que te sea de utilidad.
Atentamente,
Eduard Pascual

    Pregunta:  15222 - LECTURA DE PUERTOS DESDE WINDOWS NT
Autor:  Jose Antonio Reyes de la Peña
Necesito habilitar el watch dog del PC en mi aplicación. Hasta ahora lo había hecho leyendo el puerto 0x443. Lectura que activa un timer que si no es refrescado cada cierto tiempo, resetea el ordenador. El problema es que ahora mi aplicación corre sobre windows NT y la lectura de los puertos no es directa.¿ Alguien tiene alguna idea?. ¿Puedo conseguir drivers que lean esa dirección?. Gracias.
  Respuesta:  Pablo Marcomini
Consulta el sitio:

http://www.beyondlogic.org/

Ahi tienen informacion acerca de lo que buscas.

Suerte

    Pregunta:  15302 - COPIAR FICHEROS DESDE C (BAJO COMPILACION EN LINUX)
Autor:  William Silva
Anticipo mis agradecimientos.

Bueno, necesito saber como puedo copiar un fichero de un directorio a otro, desde un programa en C bajo linux.

Sin mas por el momento william.
  Respuesta:  sinapse
Pues la cosa seria abrir el fichero origen para lectura, y el destino para escritura (si no existe se crea), cada uno en su directorio, e ir pasando los bytes del fichero origen a un buffer (char buffer[TAMANO]) con fread y luego escribiendolos en el fichero destino con fwrite.
A grandes rasgos es eso, si quieres mas detalles e-mail me
Salu2

    Pregunta:  15552 - CóMO INTEGRAR CONTROLES DE VB EN VC?
Autor:  Luis Ramos
Hola!, necesito ayuda. Estoy desarrollando una aplicación para mi Proyecto fín de Carrera y necesito que alguien pudiera decirme, cómo demonios puedo integrar un control Visual Basic en Visual C++ 5.0 que es con la versión que estoy trabajando. Cual sería la mejor versión de Visual Basic que debería seleccionar para que sus controles no me dieran problemas con la versión con la que estoy trabajando?.
Gracias de antemano y un saludo!!!
  Respuesta:  José Pérez Pérez
Lo primero decirte que Visual C++ 5.0 y 6.0 son bastante similares, al igual que lo son las versiones equivalentes de Visual Basic. No creo que tuvieras muchos problemas utilizando controles creados con VB 6 en un programa escrito con VC 5. Tampoco tendrías problemas utilizando las versiones 3, 4 y 5 de VB. Además, VC sólo reconocerá los controles de 32 bits, con lo que se elimina un posible problema de compatibilidad, siendo rechazados los controles Vbx de 16 bits.

Respondiendo a tu pregunta principal, sí es posible incorporar tecnología Active X (los famosos controles de VB, entre otros) en un proyecto de Visual C. La única condición indispensable es que el programa que vayas a crear soporte las MFC (Microsoft Foundation Classes).

Una vez iniciado el proyecto con su soporte para MFC, abrimos el menú Project -> Add to project -> Components and controls. Acto seguido nos aparecerá un cuadro de diálogo mostrándonos los componentes disponibles, pudiendo elegir entre los controles ActiveX registrados y los propios de Visual C. Entre los ActiveX se encontrarán los creados con o para VB.

    Pregunta:  15553 - ELEGIR ENTRE SDI, MDI O DIALOG-BASED
Autor:  Luis Ramos
Buenas de nuevo! Tengo la siguiente duda y necesito consejo. Tengo que realizar una aplicación que tiene sólo una ventana principal dònde aparecerán gráficos, pantallas (imagino que esto serán ventanas de diálogo) con la configuración seleccionada, etc. Bien pues el problema es el siguiente: quiero que antes de esta pantalla principal aparezca una primera pantalla o diálogo donde se pueda seleccionar el idioma de esta pantalla principal antes de representarla y yo opino que debería hacer esta primera pantalla como un dialog-based box, que diera paso a la pantalla principal (en el idioma especificado), que no sé si debiera ser SDI o MDI. Qué factores debo tener en cuenta para seleccionar un tipo u otro de aplicación??
Gracias de antemano y un saludo!!!
  Respuesta:  Monica Covarrubias
Mira Luis, creo que lo que tu quieres hacer es un tipo menu al inicio de tu aplicación lo cual te permitira manejar ciertas cajas de dialogo, es una aplicación mucho mas sencilla, solo implementas cajas de dialogo y controles. solo utilizas la clase CDialog

Si quieres utilizar un SDI o un MDI, estos tipos de aplicaciones mas que nada son para crear documento-vista y tienes que manipular dos tipos de clases que te genera el AppWizard: CDoc, que es donde manipulas los datos, variables, etc. y la clase CView, que es donde tienes que presentar lo que se esta llevando a cabo
Espero te sirva este comentario, y que no sea demasiado tarde
saludos

    Pregunta:  15608 - CONFIGURAR GRAPHICS.H
Autor:  nelson
por favor no puedo correr graphics.h en c++ 3.0. cuando compilo el programa me envia errores en las declaraciones de la libreria, el mensaje es algo asi:
value of far unknow or zero...
por favor ayuda
  Respuesta:  Armando Nava
Tienes que activar las graficas

Menu
OPTIONS/LINKER/LIBRARIES
[x]Graphics

Una vez compilado el programa, para correrlo cambiate de directorio

Menu
FILE/CHANGUE DIR
TC/BGI

    Pregunta:  15754 - COMO PUEDO SABER LA VELOCIDAD DEL PROCESADOR EN C
Autor:  Hervi Molina
Estoy buscando la forma de determinar la velocidad desde un programa en C, si alguien sabe porfavor me lo diga.
  Respuesta:  Claudio Romero
En realidad el ejemplo es C++ Builder 3, no de C pero por si te sirve
aca hay un fragmento del fuente. El programa completo lo envie para
bajarlo zipeado.

Compila en Borland C++ Builder 3, bajo procesadores Pentium o
superiores.

int Calcula_MHZ_procesador()
{
unsigned long HI_inicio,LO_inicio,C;double cantidad;
asm
{
db 0x0F, 0x31 // opcode for RDTSC
mov HI_inicio,edx
mov LO_inicio,eax
}
Sleep(500);
asm
{
db 0x0F, 0x31 // opcode for RDTSC
sub eax,LO_inicio
jnc @no_carry
dec edx
@no_carry:
sub edx,HI_inicio
mov ecx,1000 // en eax cuantos miles de ciclos pasaron en medio seg.
div ecx //edx:eax / ecx
mov C,eax
}
cantidad=C;
cantidad=(cantidad / 1000)*2;
return INT(cantidad);
}

Llamada de la funcion. (Devuelve por ej 301 serian mhz)
Button1->Caption=IntToStr(Calcula_MHZ_procesador());

Los fuentes y el ejecutable en C++ Builder se pueden bajar aqui http://www.gratisweb.com/qhm/MHZ_procesador_exe.zip

Saludos

    Pregunta:  15759 - INSTALAR LIBRERIA GLUT.H Y EJECUCION DE UN PROGRAMA OPENGL
Autor:  Erick Arostegui Cunza
Deseo que me explique como inatalar la libreria Glut.h y ademas de como configurar mi sistema para esta libreria. Y si no es mucha molestia me podrian decir paso a paso como crear un programa o en consecuencia donde pego el codigode un ejemplo pequeño.
  Respuesta:  Pedro Ignacio Fdez.-Arroyo Fraile
Para usar la libreria glut solo tienes que copiar el fichero glut.h en el directorio "Include" de tu compilador, y la libreria glut.lib en el directorio donde el compilador al macene las librerías.También es recomendable copiar el ichero glut.dll o glut32.dll en el directorio "Windows\system" para que los programas que crees puedan hacer uso de ella.
En la página www.opengl.org puedes encontrar todo tipo de información sobre tutoriales y código.

Un saludo y Happy code

|<  <<  31 32 33 34 35 36 37 38 39 40 41  >>  >|