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 09-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
Form en DLL

Hola a todos,
Estoy realizando un programa en el cual hay un campo CONTRASEÑA si el usuario graba los cambios aparecera una ventana (la cual esta incluida en la DLL) donde se solicita confirmar la contraseña, el programa verificara que ambas contraseñas sean iguales, esto lo confirma por medio de una funcion (incluida tambien en la DLL), el intento lo hice por medio de un PROCEDURE (para que apareciera la ventana y no hubo inconveniente) pero al realizarlo con una FUNCTION me genera un error:

Access violation at address 00000000. Read of address 00000000.

Alguien podriame decirme donde tengo el error??, adjunto el codigo fuente:
  • Codigo fuente DLL

Código Delphi [-]

library CLDRes;  
uses   
SysUtils,   
Classes,   
bsSkinData,   
Forms,   
Controls,   
uPassOk in 'FORM\uPassOk.pas' {wPassOk};  
{$R *.res}  
function ConfirmPass(S: string; H: THandle): Boolean; stdcall; 
begin     
Application.Handle := H;     
with TwPassOk.Create(Application) do     
  try       
    ShowModal;       
    if ModalResult = mrOk then         
      if S = '' then  Result := False 
      else           
        if S <> pePass.Text then 
         Result := False 
        else             
         Result := True       
       else         
        Result := False;     
  finally       
    Free;     
  end; 
end;  

exports     Mensajes, ConfirmPass;  
begin 
end.
  • Codigo Fuente del programa

Código Delphi [-]
procedure TwMain.ClickStateChange(Sender: TObject); 
var   
  DllHandle : THandle;    
  Error : function (I: Integer): String; stdcall;   
  DlgForm: function (S: string; H: THandle): Boolean; stdcall; 
begin   
  with wDataModule do     
    if dsUser.State = dsInsert then       
      if (Sender as TbsSkinButton).Name = 'btAdmPost' then  begin         
       try           
         DllHandle := LoadLibrary('CLDRes.dll');           
         @DlgForm := GetProcAddress(DllHandle,'ConfirmPass');           
         if DlgForm(dbeAdmPass.Text,Application.Handle) = True then             
           ShowMessage('Si') else ShowMessage('no');         
      finally           
        FreeLibrary(DllHandle);         
      end;       
    end; 
end;

Agradesco de antemano la colaboracion brindada.

Última edición por Neftali [Germán.Estévez] fecha: 09-08-2012 a las 17:39:59. Razón: Corregir los TAG's
Responder Con Cita
  #2  
Antiguo 10-08-2012
CSIE CSIE is offline
Miembro
 
Registrado: feb 2008
Ubicación: Universo paralelo
Posts: 69
Poder: 19
CSIE Va por buen camino
Saludos,

Una posibilidad es que no has incluido ShareMem en el uses.

http://delphi.about.com/od/objectpas.../aa103003a.htm
Responder Con Cita
  #3  
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 por la respuesta, habia pensado en utilizar una variable en la DLL (Asiganandole TRUE o FALSE si los valores de las claves coinciden o no) y exportarle, pero hasta ahi me llega lo que se porque no se como leer el valor de esa variable?? podrias ayudarme con eso? o como utilizar ShareMem que estoy muy novato en eso. gracias
Responder Con Cita
  #4  
Antiguo 10-08-2012
CSIE CSIE is offline
Miembro
 
Registrado: feb 2008
Ubicación: Universo paralelo
Posts: 69
Poder: 19
CSIE Va por buen camino
Hola,

Si quieres poder pasar parámetros a tu función en la DLL de tipo string, debes incluir ShareMem en el uses:


Código:
library CLDRes;  
uses   
ShareMem,
SysUtils,   
Classes,   
bsSkinData,   
Forms,   
Controls,   
uPassOk in 'FORM\uPassOk.pas' {wPassOk};  
{$R *.res}  
function ConfirmPass(S: string; H: THandle): Boolean; stdcall; 
begin     
Application.Handle := H;     
with TwPassOk.Create(Application) do     

   ....

end;
¿Qué hace exactamente el Form TwPassOk?, porque no termino de entender esto

Código:
  try       
    ShowModal;       
    if ModalResult = mrOk then         
      if S = '' then  Result := False 
      else           
        if S <> pePass.Text then 
         Result := False 
        else             
         Result := True       
       else         
        Result := False;     
  finally       
    Free;
  end;
Responder Con Cita
  #5  
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 por responderme,

El formulario principal es donde se puede ingresar, modificar o eliminar los usuarios que van a utilizar el programa, si se va a ingresar un nuevo usuario o cambiar la CONTRASEÑA al momento de oprimir el boton POST aparecera una ventana (que esta en la DLL TwPassOk) donde solicita que se ingrese de nuevo la CONTRASEÑA, si esto es igual al campo CONTRASEÑA del formulario principal graba el nuevo usuario o la modificacion de la contraseña, en caso contrario aparece un mensaje donde me informa que las contraseñas no coinciden.

Ahora intento enviar el ModalResult del TwPassOk a una variable Pass de tipo Boolean:

Código Delphi [-]
library CLDRes;

uses
  SysUtils,
  Classes,
  bsSkinData,
  Forms,
  Controls,
  uPassOk in 'FORM\uPassOk.pas' {wPassOk};

{$R *.res}

var
  Pass : Boolean;

procedure DisplayModalForm(AHandle: THandle; S: String); stdcall;
  begin
     Application.Handle := AHandle;
     with TwPassOk.Create(Application) do
     try
       ShowModal;
       if ModalResult = mrOk then
         if S <> pePass.Text then
           Pass := False
         else
           Pass := True
       else
         Pass := False;
     finally
       Free;
     end;
  end;

  exports
    DisplayModalForm, Pass;
begin
end.

Todo funciona, la ventana me abre en ShowModal, pero no se como leer el valor asignado a esta variable (lo ensayo por ahora en un ShowMessage), me lanza un error (aqui muestro lo escrito en el formulario principal):

Código Delphi [-]

procedure TwMain.ClickStateChange(Sender: TObject);
var
  DllHandle : THandle;
     DlgForm: procedure (H : THandle; S: string);stdcall;
       Passw: Boolean;
begin
  with wDataModule do
    if dsUser.State = dsInsert then
      if (Sender as TbsSkinButton).Name = 'btAdmPost' then
      begin
        try
           DllHandle := LoadLibrary('CLDRes.dll');             
          @DlgForm := GetProcAddress(DllHandle,'DisplayModalForm');
            @Passw := GetProcAddress(DllHandle,'Pass');
          DlgForm(Application.Handle, dsUserPASS.AsString);
          ShowMessage(BoolToStr(Passw));          
        finally
          FreeLibrary(DllHandle);
        end;      
end;

Gracias de antemano tu ayuda, si me puedes explicar como utilizar el ShareMem o si se puede solucionar algo en este codigo fuente, me disculpas por tanta molestia pero no soy muy experto en esto.

Última edición por Jose Roman fecha: 10-08-2012 a las 17:54:14.
Responder Con Cita
  #6  
Antiguo 10-08-2012
CSIE CSIE is offline
Miembro
 
Registrado: feb 2008
Ubicación: Universo paralelo
Posts: 69
Poder: 19
CSIE Va por buen camino
Algo asi debería funcionarte (no lo he probado )

Código Delphi [-]
library CLDRes;

uses
  ShareMem, //Importante
  SysUtils,
  Classes,
  bsSkinData,
  Forms,
  Controls,
  uPassOk in 'FORM\uPassOk.pas' {wPassOk};

{$R *.res}


function DisplayModalForm(AHandle: THandle; S: String): Boolean; stdcall;
begin
     result := False;
     Application.Handle := AHandle;
     with TwPassOk.Create(Application) do
     try
       if ShowModal = mrOk then
         result := S = pePass.Text; 
     finally
       Free;
     end;
end;

  exports
    DisplayModalForm;
begin
end.

Código Delphi [-]
procedure TwMain.ClickStateChange(Sender: TObject);
const
  DLLNAME = 'CLDRes.dll';
var
  Passw: Boolean;
  DllHandle : THandle;
  DlgForm: procedure (H : THandle; S: string); stdcall;
begin
  with wDataModule do
    if dsUser.State = dsInsert then
      if (Sender as TbsSkinButton).Name = 'btAdmPost' then
      begin
        try
          DllHandle := LoadLibrary(DLLNAME);             
          if DllHandle <>0 then
          begin
             DlgForm := GetProcAddress(DllHandle,'DisplayModalForm');
             Passw := DlgForm(Application.Handle, dsUserPASS.AsString);
             ShowMessage(BoolToStr(Passw));
          end
          else
            ShowMessage(Format('Error al cargar %s',[DLLNAME]));          
        finally
          FreeLibrary(DllHandle);
        end;      
      end;
end;
Responder Con Cita
  #7  
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
Mira estos cambios:

Código Delphi [-]
library CLDRes;

uses
  SysUtils,
  Classes,
  Forms,
  Controls,
  Unit2 in 'Unit2.pas' {wPassOk};

{$R *.res}
function ConfirmPass(S: string): Boolean; stdcall;
begin
  result := False;
  with TwPassOk.Create(Application) do
  begin
    ShowModal;
    if ModalResult = mrOk then
      if S = Edit1.Text then Result := true;
    Free;
  end;
end;
exports  ConfirmPass;
begin
end.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  if ConfirmPass(Edit1.Text) then
    ShowMessage('Si') else ShowMessage('no');
end;

A falta de tu proyecto he hecho un ejemplo que optimiza el llamamiento a la dll y evita la asignación innecesaria del Handle de la aplicación.

Subo el proyecto de ejemplo.


Saludos.

Última edición por escafandra fecha: 09-03-2020 a las 08:00:24.
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 22:21:49.


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