Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   carga dinamica de un dllform (https://www.clubdelphi.com/foros/showthread.php?t=66751)

pabloloustau 10-03-2010 18:10:44

carga dinamica de un dllform
 
hola a todos!
quiero hacer una aplicacion que por medio de un combobox u open file pueda añadir el nombre de librerias y ejecutarlas en el programa.
las librerias son dllform y he intentado hacer algo como esto sin exito:

type
tproc= procedure;
var
handle:thandle;
dllname:string;
proc:tproc;
begin
dllname:= combobox1.Text;
handle:= loadlibrary(pchar(dllname));
proc:= getprocaddress(handle, pchar(ShowDllFormModal));
end;

se que faltan las ecepciones y liberarla de memoria pero el codigo no me funciona a pesar que tengo las dll en la carpeta del ejecutable.
alguien me podria dar una mano por favor, que me re trabe con esto...gracias.:)

Ñuño Martínez 10-03-2010 18:22:13

Así, para empezar, no nos has dicho qué falla. Es decir, no es lo mismo que muestre un error de que no encuentra tal archivo que una violación de segmento o una corrupción de memoria. Mejor que copies el error y lo pongas aquí.

pabloloustau 10-03-2010 18:31:16

si tenes razon, disculpame.
no sale ningun error, directamente no pasa nada, no se ejecuta la dllform.

pabloloustau 10-03-2010 18:42:12

perdon aca esta el error:

[DCC Error] Unit8.pas(37): E2003 Undeclared identifier: 'ShowDllFormModal'

como declaro el export showdllformmodal??

pabloloustau 10-03-2010 18:49:35

le declare el ShowDllFormModal como string compilo bien pero cuando selecciono el dll en el combobox y clickeo no pasa nada, no tira ningun cartel de error pero tampoco se ejecuta el dllform


procedure TForm7.Button1Click(Sender: TObject);
type
tproc= procedure;
var
handle:thandle;
dllname:string;
ShowDllFormModal:string;
proc:tproc;
begin
dllname:= combobox1.Text;
handle:= loadlibrary(pchar(dllname));
proc:= getprocaddress(handle, pchar(ShowDllFormModal));
end;

pabloloustau 10-03-2010 21:02:29

perdon por tantos mensajes pero ya tube una solucion aunque con algunos problemitas

type
TProc = procedure;
var
Proc: TProc;
Handle: THandle;
DllName: string;
ShowDllFormModal:string;
begin
DllName:= combobox1.Text;
ShowDllFormModal:= combobox2.Text;
Handle := LoadLibrary(PChar(DllName));
if Handle = 0 then
raise Exception.Create('DLL no encontrada: ' + DllName);
try
Proc := GetProcAddress(Handle, PChar(ShowDllFormModal));
if @Proc = nil then
raise Exception.Create('Función no encontrada: ' +
ShowDllFormModal);
Proc;
finally
FreeLibrary(Handle);
end;
end;


con este codigo puedo ejecutar un dll ingresando el nombre del dll y el nombre de la funcion en un combobox.
en mi caso ejecute un showdllformmodal el problema es que cuando cierro la aplicacion showmodal me salen dos errores:

1- access violation at address 00c8c1130 read of address 00c8c1130
2- el identificador de la ventana no es valido.

como hago para eliminar estos errores???

Ñuño Martínez 11-03-2010 09:47:52

Veo que has estado trabajándotelo, eso está bien. :)

Cita:

Empezado por pabloloustau (Mensaje 356471)
en mi caso ejecute un showdllformmodal el problema es que cuando cierro la aplicacion showmodal me salen dos errores:

1- access violation at address 00c8c1130 read of address 00c8c1130
2- el identificador de la ventana no es valido.

como hago para eliminar estos errores???

El error 1 indica que estás intentando acceder a una parte de la memoria que no es accesible. Posiblemente el programa está intentando acceder a alguna función o método de la DLL después de que la hayas descargado (eliminado) de la memoria.


La franja horaria es GMT +2. Ahora son las 11:41:39.

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