Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-10-2011
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
Compartir instancia de un objeto

Hola como han estado, espero que bien.


Verán mi consulta es un poco rara pero ahí va, tengo 5 aplicaciones diferentes que se pueden ejecutar muchas veces en una sesión, lo diferente de estas aplicaciones es que usan la misma base de datos (funcionan con firebird 2.1), y con lo cual tenemos 5 conexiones y desconexiones a la misma base de datos en múltiples veces, y en ocasiones la conexión a la base de datos tarda más de lo que me gustaría (ya que son de tipo cliente servidor). Así que me gustaría saber si hay un modo en el que dos aplicaciones pueden compartir un mismo espacio de memoria, para que en ese espacio común pueda instanciar un TIBDatabase al cual se enlacen todas las aplicaciones y así solo haya una conexión a la base de datos, esto es siquiera posible? Necesito algo similar al espacio compartido que se crea con “CreateFileMapping” pero con la diferencia de que pueda compartir una instancia de un objeto. O que más podría hacer, para que solo hubiera una conexión a la base de datos en lugar de 5?
Responder Con Cita
  #2  
Antiguo 03-10-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Juraría que Al González hizo esto que quieres. Busca...

// Saludos
Responder Con Cita
  #3  
Antiguo 03-10-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola roman.

Yo también me acordaba del hilo de Al (pienso que hablamos del mismo). Lo busque a la tarde sin poder encontrarlo, pero ahora creo que lo ubiqué: Objetos superglobales .

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 03-10-2011
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
Gracias roman, ecfisa.

Es una lástima, pero no. Lo que hacen los objetos súper globales del compañero Al González es crear una clase que sí que serán vistas en múltiples aplicaciones, pero con las limitaciones clásicas de la creación de espacios compartidos, entre estas limitaciones hay una que es la de no compartir ni crear punteros en el espacio compartido (por favor corríjanme si no es así). Lo que yo intento hacer es más bien acceder directamente al espacio de memoria de otra aplicación (ya que la instancia de TIBDatabase tiene que estar en la aplicación que se abra primero), lamentablemente con dos días de búsqueda e intentos creo que no se va poder.

Ahora mismo estoy intentando hacer esto abriendo las aplicaciones como subprocesos de una aplicación padre que se supone será la que comparta la base de datos, pero no me ha sido posible acceder a esa parte de la memoria en donde esta instanciado el componente, mmm estoy comenzando a creer que es imposible acceder a otro espacio de memoria que no sea el que te asigna el SO, seguiré viendo por ahí y si alguien mas tiene una que otra sugerencia ps hacérmela saber.
Responder Con Cita
  #5  
Antiguo 03-10-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por _cero_ Ver Mensaje
Ahora mismo estoy intentando hacer esto abriendo las aplicaciones como subprocesos de una aplicación padre que se supone será la que comparta la base de datos, pero no me ha sido posible acceder a esa parte de la memoria en donde esta instanciado el componente...
Pues con esta técnica no deberías tener demasiados problemas. Los punteros los puedes compartir...

Cita:
Empezado por _cero_ Ver Mensaje
...estoy comenzando a creer que es imposible acceder a otro espacio de memoria que no sea el que te asigna el SO, seguiré viendo por ahí y si alguien mas tiene una que otra sugerencia ps hacérmela saber.
No desesperes demasiado. Se puede conseguir cotillear el espacio de memoria de otro proceso aunque la tarea es delicada. Mírate la API ReadProcessMemory y las de su familia. Quizás te abra una vía a la solución de tu problema, pero como te dije es delicado y dificultoso llegar a buen puerto.

Quizás te interese leer esto aunque es posible que ya le hayas echado un vistazo. También puede ser de tu interés este tema y este otro.

En una ocasión necesité husmear en procesos de sistema y escribí una dll que, básicamente, inyectada en un proceso leía su memoria memoria y lo escribía en el espacio de memoria de mi proceso inyector. Pude, de esa manera, obtener la información que me interesaba.

Como te he comentado antes, y es por eso que no contesté previamente, este sistema no es fácil y puediendo provocar inestabilidades en tu aplicación. Pero, ya a la desesperada, es una vía interesante, al menos de investigación, y puede que termines consiguiendo lo que te propones.

Saludos.
Responder Con Cita
  #6  
Antiguo 03-10-2011
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
Haaaa después de un sueño reparador el mundo pinta diferente . Por otro lado mil gracias escafandra por los enlaces, sí que ya había pasado por esos hilos pero como en cada definición de inyección leía que se trataba de ejecutar mi código en otro espacio pues pensé (precipitadamente), que al ser su espacio estaría en las mismas, porque no vería mi espacio, pero después de un sueñin y una leída más profunda (por tu recomendación), me doy cuenta que no solo se pueden inyectar ciertas funciones, sino que también se pueden inyectar directamente estructuras y todo lo que sea escribible en memoria (o sea que quizás pueda inyectar una copia de mi instancia ya conectada), así que profundizare mas en este interesantísimo tema y espero que en un par de horas más ya tenga código funcional (que desde luego subiré para concluir este hilo).
Responder Con Cita
  #7  
Antiguo 04-10-2011
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
mmm esto ya se ha complicado demasiado, les cuento, hice una inyección simple de la instancia de un TIBDatabase en otro proceso, e incluso logre pasar un TIBDatabase a través de la memoria compartida que se crea con CreateFileMapping(copiando Byte a Byte de la instancia en memoria), en ambos casos me ocurrió lo mismo, sí que me copia la instancia de TIBDatabase a el nuevo espacio de memoria y sí que se ve conectada correctamente (claro sin necesidad de volver a conectar, lo probé con LoginPrompt a true, para ver felizmente que me conectaba sin mostrarme el dialogo de contraseña), ahora el problema viene cuando intento ocupar la copia de esa base de datos, me tira violaciones de acceso porque resulta que dentro del TIBDatabase hay más punteros aun (bastante razonable a decir verdad), y esto haría de la copia de una instancia de TIBDatabase toda una odisea (que no algo imposible), ya que esos punteros internos quedan apuntando a espacios inexistentes de memoria y de ahí las violaciones, así que me quedan dos caminos: 1 resignarme y dejar 5 conexiones, o 2 seguir viendo cómo acceder a todo el espacio de memoria de una aplicación y no solo a unas fracciones (me huele que optare por el segundo y jugare con una que otra api indocumentadas, CreateKernelThread me está haciendo ojitos).

Pd. En cualquier caso si logro acceder a todo el espacio de memoria de una apli, subiré como lo he hecho, porque valla tema más interesante con el que me he topado (gracias a escafandra).
Responder Con Cita
  #8  
Antiguo 04-10-2011
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Algo común en estos casos es tener un ejecutable principal con la conexión y dividir el resto de las aplicaciones no en ejecutables autónomos también (puesto que la autonomía ya no es tal), sino en bibliotecas DLLs. De esa manera siempre se estará usando el mismo espacio de memoria, con la ventaja de compartir todo aquello que sea necesario, no solamente el objeto conexión.

Considera, además, el uso de la propiedad Handle y el método SetHandle de TIBDatabase.

Saludos.

Al.
Responder Con Cita
  #9  
Antiguo 04-10-2011
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
Gracias por la sugerencia Al González (y perdón por los corchetes de la última vez jeje), cierto lo de las dll (ya tengo un par de aplicaciones modularizadas así y otras tantas con bpl’s), la cuestión es que estas ya están programadas así, y quería evitarme el trabajo de adaptarlas de nuevo además de que es un poco divertido encontrar cosas y métodos nuevos, así que ahora que tengo un tiempo de sobra seguiré viendo el cómo invadir otros espacios de memoria jeje que según he visto por ahí de que se puede, se puede.
Responder Con Cita
  #10  
Antiguo 05-10-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Veo que te ha enganchado el tema, _cero_. Ya te has dado cuenta que no es tan sencillo y que no es comparten los contenidos de los punteros a no ser que los rastrees y copies esos contenidos también...

Compartir a través del Kernel tampoco es fácil. Su espacio de memoria reservado es escaso y su escritura puede provocar el desastre, BSOD. Puedes seguirle la pista a la indocumentada ZwSystemDebugControl. Desde un driver puedes cotillear la API KeStackAttachProcess.

Existe otra forma de inyección mas sencilla que todo lo anterior aunque mas burda, menos sutil. Se trata de inyectar todo un modulo en otra aplicación. Digamos que es como abrir un proceso inyectado todo él en otro y por tanto en su espacio de direcciones. En ester sentido puedes leer algo del Formato PE. Te recomiendo la lectura de este tema y en concreto de este código de ArdiIIa.

Como ves se le puede dar muchas vueltas al tema de la invasión o inyección de procesos, desde el espacio usuario al Ring 0.


Saludos.
Responder Con Cita
  #11  
Antiguo 05-10-2011
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
Gracias por los enlaces escafandra, sí que me he enganchado con este tema, es nuevo y sí que tiene potencial para muchos tipos de aplicaciones, por el momento para este problema concreto optare por convertir las aplicaciones a módulos, pero no dudes ni por un segundo que apenas le halle a este tema lo aplicare en muchos casos, seguiré averiguando sobre esto y por supuesto compartiré más adelante lo aprendido, pero tendrá que ser en un poco más de tiempo, ya que me han caído otras cosas en las que ocuparme .
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Instancia de un objeto dao_ar OOP 1 25-06-2011 09:53:04
Problema con Instancia de SQL jdattoli SQL 0 30-03-2009 20:46:06
instancia de sql 2000 richy08 MySQL 4 17-12-2007 23:04:46
Es posible compartir carpetas por Internet utilizando compartir carpetas? JuanErasmo Windows 5 12-02-2007 20:45:17
Compartir instancia de "capa Intermedia" maro Providers 1 06-03-2004 21:00:15


La franja horaria es GMT +2. Ahora son las 14:09:51.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi