Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-08-2012
Jose Roman Jose Roman is offline
Miembro
 
Registrado: jul 2006
Ubicación: Colombia
Posts: 364
Poder: 21
Jose Roman Va por buen camino
Gracias a ustedes me funciono, me faltaba poco pero sin sus ayudas no hubiera sido posible...
desde Colombia un saludo

Última edición por Jose Roman fecha: 10-08-2012 a las 19:23:05.
Responder Con Cita
  #2  
Antiguo 10-08-2012
Jose Roman Jose Roman is offline
Miembro
 
Registrado: jul 2006
Ubicación: Colombia
Posts: 364
Poder: 21
Jose Roman Va por buen camino
escafandra te pregunto, lo hice tal cual como me mandaste el ejemplo, pero en que momento se libera la memoria o la Dll, como se hace con FreeLibrary(DllHandle);
Responder Con Cita
  #3  
Antiguo 10-08-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
En el caso del ejemplo no se debe liberar explícitamente la dll, se realiza automáticamente al terminar el programa. FreeLibrary se usa cuando conoces el HMODULE de la dll que cargaste con LoadLibrary, y no es obligatorio liberarla.

Verás, existen dos formas básicas de que un proceso cargue una dll:
- Una estática automática que la realiza el S.O. al cargar el ejecutable. En la cabecera PE del ejecutable existe una lista de las funciones que se importan denominada IAT (tabla de importación de direcciones).
- Otra dinámica en tiempo de ejecución con LoadLibrary y GetProcAddress. En este caso no estás obligado a liberar la dll, se libera al cerrar la aplicación.

Cada proceso sólo carga una copia de la dll aunque se llame mas de una vez a LoadLibrary. Se tiene in contador interno que aumenta con cada llamada a LoadLibrary y decrece con FreeLibrary. Una dll se libera cuando el contador es cero.

Siempre es posible forzar la liberación de una dll con FreeLibrary pues podemos conocer le HMODULE con GetModuleHandle pero en el caso de una dll cargada estáticamente y que no conocemos, su descarga puede hacer caer al programa con mucha probabilidad.



Saludos.

Última edición por escafandra fecha: 10-08-2012 a las 23:15:56.
Responder Con Cita
  #4  
Antiguo 11-08-2012
Jose Roman Jose Roman is offline
Miembro
 
Registrado: jul 2006
Ubicación: Colombia
Posts: 364
Poder: 21
Jose Roman Va por buen camino
Me resulto un error curioso...
Como el la DLL tengo una serie de errores los cuales voy numerando:
Funcion dentro de la DLL:
Código Delphi [-]
function Mensajes ( I : Integer ) : string; stdcall;
  var
    S : string;
  begin
    case I of
      1000 : S := 'No se puede eliminar un USUARIO con registros';
      1001 : S := '¿Desea eliminar este USUARIO?';
      1002 : S := 'Verifique que los datos sean correctos, una vez agregado solo se podra'+#13+'modificar TIPO, ESTADO y CONTRASEÑA. ¿Desea continuar con este proceso?';
      1003 : S := 'Usted no esta autorizado para cambiar esta CONTRASEÑA';
      1004 : S := 'Usted no esta autorizado para ELIMINAR un USUARIO';
      1005 : S := 'Usted no esta autorizado para AGREGAR un USUARIO';
      1006 : S := 'Campo USUARIO se encuentra vacio';
      1007 : S := 'Campo NOMBRE se encuentra vacio';
      1008 : S := 'Campo CONTRASEÑA se encuentra vacio';
      1009 : S := 'Las CONTRASEÑAS no coinciden';
      1010 : S := 'Debe elegir el TIPO de USUARIO';
      1011 : S := 'Debe elegir el ESTADO del USUARIO';
    end;
    Result := S;
  end;
Al momento de comprobar el campo CONTRASEÑA y deliberadamente hago que no concidan las contraseñas me lanza sin ningun problema el error 1009, pero si vuelvo hacer que no coincidan me aparece un error:
Access violation at address 2115448E in module 'borlndmm.dll'. Write of address 216635C
Revisando paso a paso este error se lanza cuando debe aparecer de nuevo la ventana para confirmar la contraseña la cual esta en la DLL, cabe notar que si hago que concidan las contraseñas la ventana me aparece en mas de una ocasion sin inconvenientes, solo es cuando no coinciden. Que podria ser??

Código Delphi [-]
{ Este como codigo es el que me indicaste para la ventana en la DLL }
function PassModal(AHandle: THandle; S: String): Boolean; stdcall;
  begin
     Result := False;
     Application.Handle := AHandle;
     with TwPassOk.Create(Application) do  // en la segunda instancia de la ventana aqui da error
     try
       if ShowModal = mrOk then
         Result := S = pePass.Text;
     finally
       Free;
     end;
  end;

La parte donde la llama en el formulario principal es:
Código Delphi [-]
procedure TwMain.ClickStateChange(Sender: TObject);
const
  MiDll = 'CLDRes.dll';
var
  DllHandle : THandle;
       Error: function (I: Integer): string; stdcall;
     DlgForm: function (H : THandle; S: string): Boolean; stdcall;
       Passw: Boolean;
begin
...
@Error := GetProcAddress(DllHandle,'Mensajes');
@DlgForm := GetProcAddress(DllHandle,'PassModal');
...
if dsUser.State = dsInsert then
  if (Sender as TbsSkinButton).Name = 'btAdmPost' then
  begin
    if not dsUserPASS.IsNull then
    begin
      Passw   := DlgForm(Application.Handle, dsUserPASS.AsString);
      if not Passw then MessageDlg(Error(1009),mtError,[mbOK],0);
    end
  end;

Última edición por Jose Roman fecha: 11-08-2012 a las 00:34:58.
Responder Con Cita
  #5  
Antiguo 11-08-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Código Delphi [-]
Application.Handle := AHandle; /// ???????????

Saludos.
Responder Con Cita
  #6  
Antiguo 11-08-2012
Jose Roman Jose Roman is offline
Miembro
 
Registrado: jul 2006
Ubicación: Colombia
Posts: 364
Poder: 21
Jose Roman Va por buen camino
Si no utilizo eso me aparece el error:

System Error. Code 1400. El identificador de la ventana no es valido.

En este codigo me ayudo CSIE como puedes observar
Responder Con Cita
  #7  
Antiguo 11-08-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Si te fijas en el ejemplo que te pasé yo no asigno ningún Handle a Application ni lo uso como parámetro y funciona correctamente. No tiene sentido que pases el Handle de Application para luego volverlo a asignar a Application...

A parte de esa asignación, debes tener otro error en el código que no puedo reproducir pues a mi no me falla. En ocasiones un error de punteros ocasionan el fallo en otra zona del código.


Saludos.
Responder Con Cita
  #8  
Antiguo 11-08-2012
Jose Roman Jose Roman is offline
Miembro
 
Registrado: jul 2006
Ubicación: Colombia
Posts: 364
Poder: 21
Jose Roman Va por buen camino
Ok ensayare y te comento, gracias
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
Determinar en un Form Principal cuando se Cierra un Form Hijo Efren2006 OOP 5 26-02-2009 20:08:35
llamar al evento click de un boton q se encuentra en un form desde otro form TURBOIGOR OOP 6 02-12-2008 14:50:16
Como llamar form desde otros form y regresar a la linea que se estaba ejecutando Willy Rodrigo C++ Builder 1 03-08-2007 19:36:23
Form modal deja que el form llamante tome el foco tata Varios 6 17-05-2006 11:51:37
Imposible hacer visible un form desde otro form SMTZ .NET 13 16-01-2006 21:41:08


La franja horaria es GMT +2. Ahora son las 23:23:42.


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