PDA

Ver la Versión Completa : parametros entre dll's


xgerard
20-11-2003, 20:33:59
hola a todos ...

estoy haciendo un proyecto que requiere el uso de varias dll (dos para ser exacto) ... la descripcion general es la siguiente : la interfaz , 1er dll con validaciones , 2 dll que se conecta a la base de datos...

el problema que tengo es al pasar parametros entre los dll, el proyecto manda error de memoria y se bloquea ... en cambio si no uso paso de parametros entre los dll la aplicacion funciona correctamente , desafortunadamente debe cumplir con el requisito de usar 2 dll...

espero que me puedan ayudar ...

si necesitan mas info por favor diganmelo

delphi.com.ar
20-11-2003, 20:47:16
¿Cómo es que estas pasando estos parámetros?

xgerard
20-11-2003, 21:01:26
asi tengo declarado dentro del 1er dll :

procedure alta(nom, mae : PChar; ed, grad : integer);register; external 'conexion.dll';

/////esta es la funcion donde hago el llamado ...

function valida_alumno(nombre, maestra : string; edad, grado : integer ): integer; stdcall;
begin
if (nombre = '') then
Result := 1
else
if (edad<5 )or(edad >12) then
Result:=2
else
if(grado<1) or (grado>6) then
Result :=3
else
if (maestra = '') then
Result := 4
else
begin
alta(PChar(nombre),PChar(maestra),edad,grado);
Result := 0;
{llamar al dll de conexion a la BD}
end
end;

///este es el cuerpo de la funcion en el 2o dll

procedure alta(nombre, maestra : PChar; edad, grado : integer); register;
var
database : TADOConnection;
query: TADOQuery;
begin
database.Connected := false;
database.ConnectionString :='Provider=MSDASQL.1;Password=colegio;Persist Security Info=True;User ID=colegio;Data Source=myodbc3-test';
database.Connected := true;
query.Connection := database;
query.Close ;
query.SQL.Add ('insert into alumno values ('''+nombre+''','+inttostr(edad)+','+inttostr(grado)+','''+maestra+''')');
try
query.ExecSQL ;
except on E: Exception do
showmessage ('error con la memoria :S')
end;
database.Connected := false;
end;

//// anteriormente los PChar los tenia como string, porque creia que ese era el error, pero no fue asi :(

delphi.com.ar
20-11-2003, 21:07:49
No me gusta mucho esto... ¿Has intentado Debugear la DLL?... ¿Sabes como hacerlo?

xgerard
20-11-2003, 21:13:57
nop =/

delphi.com.ar
20-11-2003, 21:20:36
Para probar una dll, necesitas el programa que haga de "Host"... en este caso este programa es tu aplicación. Abre el proyecto de la DLL, en el menú Run\Parameters define en la casilla "Host Applications" el nombre de tu aplicación, a partir de ahí puedes empezar a debugear tu dll montándose en tu aplicación.
Normalmente lo que hago en estos casos es armar un Project Group donde esten incluídos los DPRs de la DLL y el host y esto hace mucho mas fácil la tarea.
Pruébalo, y coméntame que tal... ¿Ok?

xgerard
20-11-2003, 21:22:32
ok mil gracias!!!

nos leemos en unas horas

saludos desde Mexico :D

xgerard
21-11-2003, 00:03:37
siguiendo con lo mismo ... hay alguna forma de inicializar los objetos ADOConnection ?

:)

ya estuve tratando de hacer el debug, y simplemente al entrar a la funcion que esta en la segunda dll, la aplicacion causa error... claro que esto no sucede si la funcion es sin parametros .. .. .

asi que sigo en las mismas :confused:

delphi.com.ar
21-11-2003, 00:26:27
Con BDE, recuerdo que se podía inicializar la base de datos en un proceso, y con pasarle el Handle del TDataBase a otro TDataBase, este compartía la conexión.

¿Oíste hablar de las DLLs de clases (BPLs)?.... posiblemente por ese lado encuentres una solución mucho mas sencilla.

Saludos!

xgerard
21-11-2003, 01:45:39
sigo perdido :confused: estuve leyendo de las BPL y no logro entender ... :S

estoy probando usar una sola dll para hacer todo el trabajo, pero ahora el proyecto se bloquea en la primer linea que tiene que ver con el ADOConnection, ademas de que al compilarlo aparece un warning de que no se ha inicializado el objeto ADOConnection ...



... estoy a punto de lanzarme por la ventana :(

delphi.com.ar
21-11-2003, 14:33:48
Fíjate si este hilo te puede ayudar en algo: http://www.clubdelphi.com/foros/showthread.php?s=&threadid=897

Saludos!

xgerard
21-11-2003, 23:37:02
pues resulta que ya hace lo que debe (usando 2 dlls :D ) ... todo era el problema de inicializar el ADOConnection y ADOquery ...

solo que ahora al salir del proyecto causa un error de memoria... este error no aparece si el 2o dll tiene funciones sin parametros ... hay alguna manera de "liberar" esa memoria del 2o dll?(suponiendo que ese es el problema :p )

saludos!:D

delphi.com.ar
22-11-2003, 00:55:18
Cuando recibas el DLL_PROCESS_DETACH, o es muy común crear procedimientos propios para eso.
function OpenDatabase(AParam....): THandle; stdcall;
procedure CloseDatabase(ADatabase: THandle); stdcall;


Saludos!