PDA

Ver la Versión Completa : carga dinamica de un dllform


pabloloustau
10-03-2010, 18:10:44
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. :)


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.