![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|
|
#1
|
|||
|
|||
|
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;
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;
|
|
#2
|
|||
|
|||
|
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:
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):
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. |
|
#3
|
|||
|
|||
|
Algo asi debería funcionarte (no lo he probado
)
|
|
#4
|
|||
|
|||
|
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. |
|
#5
|
|||
|
|||
|
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);
|
|
#6
|
||||
|
||||
|
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. |
|
#7
|
|||
|
|||
|
Me resulto un error curioso...
Como el la DLL tengo una serie de errores los cuales voy numerando: Funcion dentro de la DLL: 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??
La parte donde la llama en el formulario principal es:
Última edición por Jose Roman fecha: 11-08-2012 a las 00:34:58. |
|
#9
|
||||
|
||||
|
Mira estos cambios:
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. |
![]() |
|
|
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 |
|