BUSCAR EN PREGUNTAS Y RESPUESTAS

 Se han encontrado 2654 coincidencias.<<  >> 

C/Visual C
    Pregunta:  11795 - INSERCION DE UN CONTROL ACTIVEX EN VISUAL C++
Autor:  Ruben Artime Torres
He implementado un control Activex en Visual Basic que basicamente es un grid (MSHFlexGrid) con ciertas propiedades de formateado de las celdas. La cuestion es que la tecla ENTER debería servir para navegar por el grid y de hecho asi lo hace si inserto el control en un formulario de VB pero si lo hago en una ventana de Visual C++ la tecla ENTER pierde por completo su funcionalidad. ¿Alguien sabe a qué es debido y cual es la solución?
Muchas gracias
  Respuesta:  Lucas Martin
La propiedad de controlcontainer debe estar a true

    Pregunta:  11871 - CUALES TIPOS DE EXTENSIONES EXISTEN EN VISUALC Y SIGNIFICADO
Autor:  luis andres rodriguez
cuales son las extensiones que crea el visual c++ 6.0 y para que sirve cada una de las extenciones.
  Respuesta:  Xabi Rodriguez Pardo
Aupa, la extensión más importante al crear un proyecto con Visual C++ es: *.dsw (éste es el archivo principal). Aunque también se podrá abrir tu proyecto con el *.dsp; luego también existen más ficheros: de recursos, etc.
Espero que t haya servido de algo. AGUR.

    Pregunta:  11876 - COMPILAR CON OPCION /STACK
Autor:  Rosalia Rojas
Hola a tod@s,
Necesito usar un programa de simulacion en C escrito por otra persona (!!). Para ello compilo ese programa usando MicroSoft Visual C++ sin obtener ningun mensaje de error. Lo malo es que a la hora de correr el programa obtengo el siguiente mensaje de error:
"The exception unknown software exception (0xc00000fd) occurred in the application at location 0x00401147"
El problema parece ser que es de memoria pues obtengo el mismo mensaje simplemente cuando corro un programita en el que solo incluyo la declaracion de las variables del programa y una sentencia 'printf'. Las variables consisten (entre otras muchas) en 16 matrices bi-dimensionales y 5 tri-dimensionales de 200x300. Alguien me dijo que fue capaz de correr el programa "usando la opcion /stack al compilar". ¿ Como usas esas opcion con el compilador de MicroSoft Visual C++ ? ¿Donde la defines ? ¿Hay alguna otra solucion en la que no suponga tener que efetuar allocacion dinamica de memoria ?
Yo he estudiado programacion en C por mi cuenta pero hay cosas a las que definitivamente no llego.
Muchas gracias de antemano por vuestra colaboracion.
  Respuesta:  Oscar Medina
Seguramente es problema de memoria, para contestarte por ahi habria que ver el codigo.
Te contesto lo mas facil que es poner /stack en la compilacion:
Tenes que ir a la opcion del menu "Project" ahi seleccionas la opcion "Setting", se te va a abrir una ventana que a la izquierda tiene muchos tabs, selecciona el que dice "C/C++", abajo de todo te va a aparecer una seccion que dice "Project Option", ahi abajo tenes todas las opciones que por defecto usa para compilar y es editable, entonces lo unico que tenes que hacer es agregar tu opcion detras de la ultima por las dudas. Espero que te haya servido mi ayuda...

    Pregunta:  13934 - DESHABILITAR UN TAB
Autor:  Jakare Solaris
¿como puedo deshabilitar un tab de la estructura ctabcontrol con visual c++4.2 ??

Gracias por la ayuda.
  Respuesta:  Melchor Viso
Lamento no poder dar la solucion exacta en este momento,
pero es del estilo:

HWND handleWindow=mytabControl->GetSafeHwnd();
::SendMessage(handleWindow,WM_<buscar>,<numero tab>,FALSE)

Hay que buscar el mensaje y los argumentos. Esto
funciona porque va a través de Win32 API directamente.

    Pregunta:  14577 - DESPLEGAR JPG'S EN VC6
Autor:  Sergio Alejandro Gomez Avila
Hola, estoy desarrollando una aplicacion en Visual C++ 6.0 y necesito cargar una imagen en jpg y desplegarla unos segundos en la pantalla para despues quitarla, pero no se como cargar la imagen.

Agradeceria a quien me pudiera ayudar. Gracias
  Respuesta:  Mario Zúñiga
Te recomiendo que hagas uso de las clase MFC CPictureHolder y la interface IPicture,es algo escueta la ayuda pero si buscas en el código fuente de MCF podras encontrar ejemplos claros para leer de archivo y presentar en pantalla o bien si tienes dudas escribe!

    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:  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:  16183 - CóMO OBTENER LA LISTA DE COMPUTADORAS DE UNA RED NETBEUI
Autor:  sergio abraham
... dentro de un programa de visual C?
Muchas gracias
  Respuesta:  Fernando Gómez
Para Windows, puedes emplear las funciones NetAPI:

NetGroupEnum
NetGroupGetInfo
NetLocalGroupEnum
NetLocalGetInfo

y subsiguientes.

    Pregunta:  16345 - LLAMAR UN COMPONENTE (DLL) DESDE UN EXE CREADO EN VISUALC++
Autor:  Monica Covarrubias
Hola :
Por favor si pueden contestar esta pregunta
estoy trabajando con herramientas
Visual C++ versiòn enterprise, SQL Server 7.0, WinNT, MTS. Estoy
desarrollando una aplicaciòn Cliente - servidor, la cual me permita tener
acceso a la BD ubicada en el Servidor, por lo tanto necesito crear componentes
(dll). Ya he creado dll`s, es decir componentes desde Visual C y Visual Basic,
ahora necesito implementarla con la interfaz de usuario (.exe), pero solo lo
he podido lograr desde Visual Basic, mi pregunta es:
¿còmo podrìa utilizar dichas sentencias de còdigo que manejo en VisualBasic, que sean las aquivalentes a visual C++?
ya que por otras razones me requieren que maneje una sola herramienta de desarrollo que es Visual c,tanto para
crear los componetes que tendràn conexion con la BD, y para la interfaz de usuario (.exe) que seràn
instalados en los clientes.

La sentencia de còdigo que utilizo en VisualBasic es la siguiente:

Private Sub Command1_Click()

Dim x As ComponneteLib.interface

Set x = CreateObject("Componnete.interface")

End Sub

Asì es como llamo al componente creado en Visual C

Como utilizo el equivalente a Visual C para llamar al componente desde mi (.exe) tambien desarrollado en VisualC
dicho ejecutable es una aplicacion basada en Dialogo.

Espero puedan ayudarme, ya que por el momento no he podido continuar con el desarrrollo de mi proyecto
Si requieren mayor informaciòn, no duden en solicitarmela.

Hasta pronto
Espero Respuesta

Monica Covarrubias L.
  Respuesta:  Jesús Antón Martín
Te has metido en un buen embrollo.

El manejo de componentes COM en VC++ es considerablemente complejo.

Desde luego es menos complejo que desde C, donde uno tiene que poner las llamadas con el protocolo correcto a mano, pero aún así, es mucho más complejo que en VB.

Para crear una instancia de un interfaz en VC++ tienes que usar el API de Win32, empezando por "CoInitialize" o "CoInitializeEx" (espero que tengas la documentación instalada), o bien puedes escoger llamar a OleInitialize (que llamará a CoInitializeEx). En cualquier caso, debes luego (cuando hayas terminado) llamar a CoUninitialize u OleUninitialize respectivamente.

Posteriormente necesitarás usar la función "CoGetClassObject", aunque puedes encontrar más fácil usar "CoCreateInstanceEx" y luego utilizar "QueryInterface" sobre el interfaz que proporciona para obtener tu instancia.

Para deshacerte de las instancias que ya no usas, llamarás a "Release" sobre cada interfaz que has recuperado. Si no lo haces, el servidor no se descargará de la memoria.

ejemplo:

...
OleInitialize(NULL);
if ((CoGetClassObject(
MyClass_REFCLSID,
CLSCTX_INPROC_SERVER,
NULL,
MyClass_REFIID,
LPVOID(MyClass_Ptr)
) == S_OK) {
MyClass_Ptr->DoWhatEverWeNeed();
MyClass_Ptr->Release();
}
OleUninitialize();
...

Este ejemplo no ha sido comprobado de ninguna forma, pero según la documentación debería funcionar.

Ha sido creado usando SOLO el API de Win32 para COM. Si esto es un problema, investiga en la MSDN cómo solventarlo ;).

Un saludo.

    Pregunta:  18092 - CONFIGURACION IMPRESORA
Autor:  Mari Garcia
Hola,
He empezado a trabajar con Visual C hace poco, y mi problema es que tengo que modificar un programa ya hecho.

He de mantener la configuración de la impresora por defecto y hacer que el cuadro de dialogo que sale por pantalla a la hora de imprimir y en donde puedes seleccionar la impresora o otra caracteristica de ésta no salga. ¿Cómo puedo hacerlo? ¿Que coja los datos de la impresora sin que salga este cuadro por pantalla?

gracias.

Mari
  Respuesta:  Miguel Solorzano
Ese proceso es automatico.... salvo desees modificar esa opcion, el Win se encarga de todo.

|<  <<  18 19 20 21 22 23 24 25 26 27 28  >>  >|