PREGUNTAS CONTESTADAS - C/Visual C

 Hay un total de 745 Preguntas.<<  >> 

    Pregunta:  15849 - QUE SOLO FUNCIONE Mí APLICACIóN
Autor:  Reisa Reisaman
Hola!

Tengo hecha una aplicación en Labwindows/CVI, o sea en C, es para unas máquinas, y me piden que cuando se ejecute mí aplicación que no se pueda ejecutar ninguna otra, ni andar en windows, o sea que solo funcione mí programa, quisiera saber como se puede hacer eso desde C, me han comentado algo sobre las API´s, pero la verdad es que no tengo ni idea de que van, la verdad es que si me ayudais os lo agradecería mucho. Gracias. Agur
  Respuesta:  Mario Zúñiga
Hola:
Tengo una solución alternativa, no se como hacer que solo tua pliación corra, pero si se como hacer para que solo se vea tu aplicación de manera que solo ella va estar presente yo hice una aplicación para que trabaja con el atributo de venta HWND_TOPMOST usando la función del API SetWindowPos, si tu aplicación trabaja con LabWindows/CVI seguro que es un sistema de adquisición de datos por lo que con poner el atributo TOPMOST ninguna otra aplicación se podra poner sobre ella.

Espero te sirva.
  Respuesta:  Hugo Ortega H.
Hola...

Desconozco el lenguaje que estas utilizando, pero si dices que es C y para Windows, debería de tener acceso a las funciones de la API
de Windows, que no son mas que el conjunto de funciones a las que las aplicaciones, independientemente del lenguaje, pueden tener
acceso para realizar funciones, por asi decirlo, de 'bajo nivel' en windows.... es una coleccion enorme de funciones de muchisimos tipos
y normalmente cada lenguaje las implementa de alguna manera.... seria cuestion de que checaras la documentacion de tu lenguaje...

ahora, lo que quieres hacer se puede hacer, efectivamente, con ciertas funciones. Las que vamos a poner aqui te van a servir
para varias cosas que en conjunto tienen el efecto que tu quieres...

* Desabilitar Ctr+Alt+Supr:
...
int dummy;
...
SystemParametersInfo( SPI_SCREENSAVERRUNNING, 1, &dummy, 0);

* Ocultar el boton inicio (y que ni siquiera funcione con la tecla windows):

EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd', nil), 0, "Button", NULL), false);

y en este momento no me acuerdo de alguna otra que te pueda servir.... pero si me escribes para recordarme con mucho gusto
te paso las demas (si las hay, la verdad no recuerdo otra que en este momento te pueda serivir....).....

saludos y ojala te sirva....

EOF

    Pregunta:  15946 - PROBLEMAS CON ATL
Autor:  Mario Zúñiga
Estoy desarrollando una familia de controles ActiveX usando ATL, esta familia de controles debe tener acceso con funciones del API tales como acceso a archivos, conexión de socket's y manejo de puerto serial, el problema surge cuando compilo mis controles en modo release ya que se presentan errores de ligado con las funciones del API, este problema solo se presenta en modo release ya que en modo debug los controles se compilan bien y corren perfectamente, espero alguíen tenga una solución, gracias!

Mario.
  Respuesta:  Melchor Viso Martinez
Sugerencias: Desabilitar la opcion de linkado incremental, deshabilitar todas las opciones de optimizacion (que ya lo están en modo Debug),
hacer un clean y un Rebuild All. Si sique fallando, pensar seriamente en utilizar la version Debug y buscar una utilidad para eliminar del ejecutable la informacion de Debug (Borland tenía una hace años).

    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:  16612 - C++BUILDER. OBTENER NOMBRE PC
Autor:  Carlos Alberto Araya Pérez
Como obtengo el nombre del PC en el cual corre la aplicación en C++ Builder. Tengo la API GETCOMPUTERNAME(), pero no se como utilizarla, porque siempre falla. Necesito tener incluida alguna librería? El código de mi programa es:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
LPTSTR dir;
LPDWORD largo;
if (GetComputerName(dir,largo)!=0)
ShowMessage("ok");
else ShowMessage("no ok");
}

Espero que me puedan ayudar por favor.
  Respuesta:  Oscar Valenzuela
Si estas utilizando Borland C++ Builder esto es lo que puedes hacer.

// estes es el tamaño del array que el API necesita
unsigned long TmpL = 200;

// estes es el buffer que va a obter el nombre de la PC
char dir[200];

if (GetComputerName(dir, &TmpL)!=0)
{
ShowMessage("ok");
ShowMessage(dir);
}
else
ShowMessage("no ok");
}
//La razon por la que no te trabajo a ti es por que nunca pusiste
// allocated) para el Buffer y el tamaño que estabas passando no tenia
//un tamaño especifico.
// PS. perdon por mi Español pero cometo muchas faltas de ortografia..

    Pregunta:  16679 - GENERACIóN ARCHIVOS POSTSCRIPT
Autor:  Esther Redondo
Necesito hacer un aplicación en C++ Builder, en la que al cerrar el fichero con el que se está
trabajando, por ejemplo un documento Word, genere un fichero PostScript de ese
documento de forma automática, sin que el usuario se entere.

Muchas gracias.
  Respuesta:  Cemendil Andayulme
Tu pregunta es un tanto genérica, dado que lo que pides es más un problema de conocimiento del lenguaje Postscript que de C++. En esencia, Postscript es un lenguaje de formateo de páginas con una estructura bastante parecida a FORTH (trabaja sobre datos organizados en pilas). Postcript fue ideado por Adobe, y es relativamente sencillo encontrar informacion sobre este lenguaje, ya sea en libros o en la red.

En esencia, yo lo que te sugeriría es que añadieses al fichero que quieres guardar (que supongo que es de texto) una cabecera postscript y un apéndice. Esto es lo que se conoce como un 'encapsulamiento' postscript. Dependiendo del fichero con el que trabajes, el encapsulamiento puede tomar unas u otras formas. En general, debería ser un trabajo sencillo. Hum... leyendo con cuidado tu petición, dices que trabajas con archivos de tipo Word: estos archivos son muy difíciles de encapsular porque están en un formato propietario. En este caso te sugiero la solución siguiente:

Una alternativa sucia pero rapida: algunos drivers de impresión de Windows (y UNIX) dan como salida datos Postscript. Basta entonces con que ordenes a tu programa en C++ que imprima el documento en un archivo, usando un driver postscript (p. ej. el de una Apple Laserwriter), y el trabajo está hecho. Desventajas: el fichero ps generado puede ser más grande y lento de lo necesario. Ventajas:
el sistema operativo se encarga de generar el Postscript, lo cual es buena cosa si trabajas con archivos de muchos formatos distintos.
Esta solución es especialmente fácil si trabajas con Windows, como creo que es el caso.

En fin, mi consejo es que encapsules en PS si puedes (aprende cómo hacerlo, que no es difícil para archivos .txt y semejantes), y si no, usa los drivers de impresión de tu SO (buena idea con formatos propietarios como Word o PDF).

    Pregunta:  16778 - COMO SE PUEDE SERIALIZAR UN OBJETO CBITMAP
Autor:  Gabriel Elias
Hola como están, he estado tratando de srializar un objeto CBitmap tomando control manual de la función serialize de CObject pero no funciona. Pr ahí dicen que la solución tiene que ver con un HBITMAP pero la verdad no le encuentro como.
Si tienes la solución porfavor escribeme.
gracias de antemano.
  Respuesta:  VICTOR CARREÑO SOTELO
Gabriel:

La clase CBitmap es serializable por el sólo hecho de ser derivada de Cobject, pero el concepto de almacenar un bitmap en un fichero es un tanto complejo, porque tienes que convertir tu mapa de bits(HBITMAP) en un DIB y grabar este conjuntamante con su paleta de colores.

No me he metido mucho en esto, pero te aconsejo entres a la página www.codeguru.com y en el lado izquierdo encontrarás un enlace a diferentes temas, entre ellos Bitmap/Palletes, allí encontrará una explicación detallada sobre este tema.

Saludos

    Pregunta:  16975 - CóMO PROGRAMAR APLICACIONES TIPO CHAT
Autor:  Pedro Miguel González
Hola, soy programador con un nivel alto en C/C++/Builder y con un nivel medio/alto en teoría de redes, pero no así en programación para las mismas. Me encuentro en la situación de tener que desarrollar una serie de aplicaciones cliente/servidor al estilo de los famosos chats, pero tengo entendido que suele haber problemas con los proxys. Podría alguien decirme en qué consisten estos problemas y qué métodos hay para solucionarlos. En su defecto, podrían decirme en donde buscar esta información ya que me he pasado algunas horas buscando en internet pero sin resultado. También agradecería cualquier código de ejemplo que pudiera ayudarme.

Un saludo y grácias de antemano
  Respuesta:  Hernán Tornielli
En c++ Builder 5 en la carpeta Examples tenés ejemplos de programas de chat. Lo mismo si buscás la Internet Component Suite (ICS) que es gratis y viene con fuentes y ejemplos de programa de chat. Se descarga en www.torry.net

    Pregunta:  16987 - CURSOR DIFERENTE DEL RATON EN MODO GRAFICO EN C
Autor:  Erick Rios
Quisiera cambiar la forma, o tamaño del cursor del raton al trabajar en modo grafico en lenguaje C, quisiera saber si hay alguna forma de poder hacerlo.

Por su tiempo y ayuda Muchas Gracias : ) !!!
  Respuesta:  Elieser Ramirez
Hola colega

realmente no soy un experto en esto pero para cambiar la forma del raton hay que hacer una mascara, esto esta bien explicado en el libro programacion en Microsoft C para IBM y compatibles en donde hablan del raton.
Espero que esto te haya servido
si tiene problemas puede escribirme un correo y le enviare la funcion para esto.

    Pregunta:  16989 - USO DE ODBC DESDE BUILDER C++
Autor:  Pedro Miguel González
Si alguien tiene experiencia en el uso de ODBC desde Builder le agradecería que me explique un poco su funcionamiento y las funciones a utilizar, o en su defecto, alguna dirección de internet en donde buscar.

Matizando un poco más la pregunta, lo que necesito es acceder mediante ODBC pero sin utilizar el BDE de Borland. Esto es así porque pienso que ODBC está más extendido (se encuentra ya instalado en la mayoría de máquinas) y da menos problemas. Esto lo digo porque me he encontrado en situaciones en las que un programa que está funcionando perfectamente de pronto deja de hacerlo porque han instalado otro programa que usa una versión anterior del BDE y sustituye a la actual. Esto puede ocurrir por varias razones:
1. Se trata de una versión antigua que no comprueba si hay un BDE más reciente.
2. hay programadores que instalan el BDE 'a pelo' y no utilizan el instalador de Borland o similar, con lo que se olvidan de comprobar la existencia de otras versiones.

Agradecería algún comentario sobre este particular.

Un saludo y gracias de antemano.
  Respuesta:  Fernando Gómez
Pedro,

efectívamente, es mejor emplear ODBC, aunque si tienes acceso a MFC, será mejor que emplees CDatabase y CRecordset, que agrupan la mayoría de las funciones que necesitas para manejar una base de datos.

El API de ODBC es muy complejo y extenso. Te enlistaré algunas de las funciones más comunes, y su utilización. Para mayor información, dirígete a www.msdn.microsoft.com/data

Como todo en Windows, necesitas llevar un control a través de HRESULTs. Hay esencialmente tres tipos de HRESULTs en ODBC: HENV para el ambiente (environment) de trabajo, HDBC para la conexión (database connection) y HSTMT para las sentencias (statements) a ejecutar. En ese orden, debes instanciar los manejadores.

Digamos, por ejemplo, que quiero hacer todos los pasos para ejecutar una sentencia SQL. Primero, debo instanciar los manejadores:
#include <sql.h>
#include <sqlext.h>
// ...
HENV henv;
HDBC hdbc;
HSTMT hstmt;
/* todas las funciones regresan SQL_SUCCESS o SQL_SUCCESS_WITH_INFO si fueron exitosas. Suponemos, en este ejemplo, que todo va bien */
SQLAllocEnv(&henv);
SQLAllocConnect(henv, &hdbc);
SQLAllocStmt(hdbc, &hstmt);

El siguiente paso, es conectarte a algún ODBC, digamos, MiOdbc. La función que se emplea es SQLDriverConnect, pero es lo suficientemente grande y laboriosa (en la explicación de sus parámetros) como para no mostrarla aquí. Sin embargo, te comento que, en la cadena de conexión, incluyes todos los datos del driver y la base de datos, el usuario y password de la misma. Yo, generalmente, sólo empleo una cadena como la que sigue:
wsprintf(szCnnIn, _T("DSN=%s; UID=%s; PWD=%s"), szDsn, szDbUid, szDbPwd);
Nunca he tenido que ir más allá de esto.

Una vez que te conectaste y tienes listo tu HSTMT, creas tu query SQL y lo ejecutas a través de SQLExecDirect. Si no te interesan los resultados que regrese tu query (como cuando ejecutas un Insert, un Update o un Stored Procedure), hasta aquí termina, generalmente tu labor. En caso contrario, necesitarás emplear las funciones SQLFetch para moverte entre los registros que regresó tu query y SQLGetData para obtener los datos. A esta última, le pasas como parámetros el tipo de dato que coincide con el campo de tu base de datos (digamos, SQL_C_TCHAR) y el número de columnas, así como el HSTMT correspondiente.

Quizás también quieras manipular las columnas de tu resultado. Para ello, se emplea SQLBind. Esta función es muy usada, sobre todo, con Stored procedures que te regresan algún resultado.

Aunque estas son las funciones mínimas que requieres para manipular tus datos, también hay otras de uso común como SQLPrepareData y SQLExecute.

Cuando termines, no se te olvide cerrar tus instancias:
SQLFreeStmt(hstmt, SQL_DROP);
SQLFreeConnect(hdbc);
SQLFreeEnv(henv, SQL_DROP);
Esto lo debes hacer en ESTE orden. Acuérdate que los manejadores citados están jerarquizados y, como habrás concluido, son interdependientes.

Ahora, la vida es más fácil con MFC. Lo único que tienes qué hacer:

CDatabase* pDBase = new CDatabase();
pDBase->OpenEx(_T("DSN=TuDsn; UID=TuUID; PWD=TuPwd;"));
CRecordset obRst(pDBase);

y empleas CRecordset::Open para ejecutar un query que regrese datos, MoveNext, MovePrevious, Move, IsEOF, IsBOF para manipular tus datos, y GetFieldValue para obtener los valores de tu query.

Si no esperas obtener algún dato de retorno, empleas CDatabase::ExecuteSQL.

NOTA: cuando termines de emplear tu CRecordset, el destructor de éste verifica que la base de datos siga abierta. Por lo tanto, no puedes cerrar la base de datos antes de que CRecordset llame a su destructor.

Espero haberos sido de ayuda.

Un saludo.
- Est solarus oth mithas -

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