Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-01-2007
jorge_mosquera jorge_mosquera is offline
Miembro
 
Registrado: mar 2004
Posts: 25
Poder: 0
jorge_mosquera Va por buen camino
Visual Basic & Delphi

Tengo una aplicacion escrita en Visual Basic (nada de .Net), donde manejo la informacion a traves de estructuras de datos que mantengo en memoria.

Tengo otra aplicacion escrita en DELPHI, la cual alimenta una base de datos Firebird.

Necesito desde DELPHI poder leer algunos de los datos de las estructuras que tengo en Visual Basic.

He pensado
1. Crear un archivo texto, en el cual vaciar la informacion desde VB y leerla desde Delphi. Pero seria alto lento y no tan fiable pues este archivo se estaria actualizando constantemente.
2. Crear una DLL, para que VB le pase a DELPHI los datos que necesita. Pero no se como hacerlo.
3. Es posible contar con una zona de memoria compartida en la cual podamos intercambiar informacion entre las aplicaciones?

Bueno, tengo este problema y la verdad no se como solucionarlo de la mejor manera.

Agradezco cualquier ayuda.
Responder Con Cita
  #2  
Antiguo 31-01-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Talking

La verdad, me parece un poco lioso tener dos programa en diferentes sistemas y que además tengan que compartir cosas.
Bueno la cuestión es que si eres tu el creador y tienes acceso al código de los dos, yo primeramente habilitaría algún sistema para que compartieran los datos de la forma más asequible posible, y en este caso el problema tuyo es que los de VB residen en memoria. Si es imperativo que la cosa sea así te surgiría que trabajaras con la la memoria mapeada, o crear un fichero mapeado en memoria tal que así:

Código Delphi [-]
{Creamos el fichero de memoria}
FicheroM:=CreateFileMapping( $FFFFFFFF,
                               nil,
                               PAGE_READWRITE,
                               0,
                               SizeOf(Estructura),
                               'Fichero_Name');

 {Direccionamos nuestra estructura al fichero de memoria}
PReceptor:=MapViewOfFile(FicheroM,FILE_MAP_WRITE,0,0,0);



{Escribimos datos en el fichero de memoria}
Estructura^:=Handle;
Estructura^.IsLocal := False;


Con este código lo que haces es crear un fichero llamado Fichero_Name mapeado en memoria y en cual has insertado la información que tú desees.
Esta información puede ser cualquiera, en este caso deberías informar al otro programa Delphi donde y como puede encontrar la información.


El siguiente paso, sería desde el otro programa (Delphi) abrir el fichero mapeado y leer la información, y acceder a ella....

Código Delphi [-]
        {Miramos si existe el fichero}
        FicheroM:=OpenFileMapping(FILE_MAP_READ,False,'Fichero_Name');
        Estructura := MapViewOfFile(FicheroM,FILE_MAP_READ,0,0,0);

Evidentemente "Estructura" debe ser igual en ambos programas.

En fin, de este modo le has pasado información de un programa a otro.
Espero que te sirva...
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #3  
Antiguo 31-01-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
También te recomiendo que le eches un vistazo al mensaje WM_COPYDATA. Recuerdo que en el pasado lo use, con éxito, para compartir información entre dos aplicaciones de Visual Basic. Aunque no tengo el código por aquí, y sinceramente, el vb lo tengo un poco oxidado
Responder Con Cita
  #4  
Antiguo 31-01-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Si es cierto WM_COPYDATA también podría servirte, la diferencia en que siempre tendría que mandar un mensaje siempre que la información del primer programa cambiara, y con el fichero mapeado, el segundo programa siempre tendría acceso a la información sin necesidad de nada más.
Es obvio que el primer programa debería permanecer ejecutándose y con el fichero mapeado para que el segundo encuentre la información.
También se me olvidó decirte en el anterior mensaje que una vez finalizado, cerraras el fichero mapeado.
Código Delphi [-]
if FicheroM<>0 then
begin
UnmapViewOfFile(xxxxx);
CloseHandle(xxxxx);
end;
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #5  
Antiguo 31-01-2007
jorge_mosquera jorge_mosquera is offline
Miembro
 
Registrado: mar 2004
Posts: 25
Poder: 0
jorge_mosquera Va por buen camino
¿Como lo hago ?

Muchas gracias ArdiIIa, al menos ya me das una luz de esperanza.
Disculpa mi ignorancia, pero nunca he trabajado con este tipo de estructuras. Podrias colaborarme con las sentencias para crear el archivo mapeado en memoria desde VisualBasic.
O donde puedo conseguir un ejemplo para estudiarlo y realizar una prueba.

Un abrazo
Responder Con Cita
  #6  
Antiguo 31-01-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Yo de basic, (mi primer lenguaje en aquellos años del MSX) estoy oxidado y de VB nada de nada.

De todas formas, el planteamiento es sencillo:
Piensa en que forma manejas tus datos desde VB, son arrays, estructuras o registros... En fin sea lo que sea supongo que tendrán algún formato...
En ese caso deberías confeccionarte un registro para poder informar al otro programa:
En delphi es tal como esto:
Código Delphi [-]
PDatitoss = ^TDatitos;
TDatidos = packed record
    Dato_1    : Cardinal;   
    Dato_2    : Cardinal;   
    Dato_Main    : Cardinal; 
    Virtual_Mem_Adr  : Pointer;  // Dirección de memoria donde se aloja algo 
    Virtual_Men_Size : LongWord; // Longitud de memoria donde se aloja ese algo
    Etc_1 : Boolean;
end;

En tu caso, deberías pasarle a tu segundo programa, por ejemplo y siempre dependiendo de tu estructura, la dirección de donde se encuentran esos datos y la longitud de los mismos. Teniendo esto claro, ya podrías manejar con el otro programa esos datos, accediendo a esa dirección primeramente y segundo dándole la estructura requerida, y siempre considerando la longitud de los datos para no cometer ninguna falta y que te saquen tarjeta roja...

Este ejemplo que te pongo aquí has de modelarlo a tu albedrío y es el registro que debería utilizar con lo que te dije antes....

Abundando mas en el tema....
Código Delphi [-]
FicheroM       : THandle;
Datos : PDatidos;

FicheroM:=CreateFileMapping( $FFFFFFFF,
                               nil,
                               PAGE_READWRITE,
                               0,
                               SizeOf(Estructura),
                               'Fichero_Name');



Datos^.Dato_1 := xxxxx;
Datos^.Dato_2l := xxxx_Handle;
Datos^.Virtual_Mem_Adr := xxx;
Datos^.Virtual_Men_Size := xxx;

/// y Así sucesivamente

Desde ese momento la otra aplicación ya tiene disponible sus datos accediendo a ello tal como te dije anteriormente.

Te vuevo a repetir que en gran medida todo es en baje a los datos que majenes, desde una sible variable, a la que deberías obtener su dirección en memoria y su longitud, hasta una compleja estructura de registros y en ese caso aún lo podrías complicar más quizás reservando un espacio de memoria concreto para ellas mediante otras funciones tales como VirtualAllocEx

En fin, todo es organizarse y ponerse manos a la obra. Sobre las funciones que te comento, tienes extensa y detallada información así como ejemplos en cualquier sitio.

Espero haberte sido de ayuda. De todas formas que tiene VB que no tenga DELPHI. Si tienes el código de ambos programas mi sugerencia final es que reconviertas lo de VB a Delphi y seguro que saldrás ganando.

Saludos
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO

Última edición por ArdiIIa fecha: 31-01-2007 a las 22:02:13.
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
Delphi VS Visual Basic woody Debates 137 18-03-2008 14:54:00
Delphi Versus Visual Básic Manuel Noticias 16 06-11-2006 19:09:24
dll de Visual Basic en Delphi elpinjum Varios 4 16-10-2006 12:37:14
Delphi V/s Visual Basic lavtaro Varios 13 02-05-2006 14:30:47
Otra de Visual Basic a Delphi. torito Varios 2 03-06-2004 22:11:35


La franja horaria es GMT +2. Ahora son las 11:38:54.


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