Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Visual Basic & Delphi (https://www.clubdelphi.com/foros/showthread.php?t=39858)

jorge_mosquera 31-01-2007 18:02:41

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.:cool:

ArdiIIa 31-01-2007 18:37:40

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...

seoane 31-01-2007 18:45:28

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 :p

ArdiIIa 31-01-2007 18:56:30

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;

jorge_mosquera 31-01-2007 21:27:25

¿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 :o

ArdiIIa 31-01-2007 21:59:20

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;)


La franja horaria es GMT +2. Ahora son las 13:50:41.

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