Delphi - Problemas con DLL's

 
Vista:

Problemas con DLL's

Publicado por M@rceloL (213 intervenciones) el 05/07/2003 00:31:27
Hola. Mi problema es el siguiente:

Resulta que tengo un programita que debe ejectuar funciones de DLL, pero no siempre usa la misma librería y no hay forma de saber el nombre de la librería al compilar el programa, por lo que la declaración de las funciones (que se llaman igual en todas las DLL's) no puedo hacerla usando eso de "external". Se entiende?

Si alguien sabe cómo ayudarme se lo agradecería eternamente.

A su vez, me gustaría saber qué tan recomendable son esos programas para comprimir EXE's y DLL's.

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problemas con DLL's

Publicado por maCo (5 intervenciones) el 05/07/2003 00:52:48
usa LoadLibrary() para cargar la dll en tiempo de ejecucion, GetProcAddress() para agarrar un puntero a la funcion y por ultimo
FreeLibrary() para descagar la funcion

para que pueda llamar a la funcion haces algo asi
.................
type
TMiProc = procedure; stdcall
var
MiProc: TProc
.............
@MiProc := GetProcAddress(hLib, 'ElNombre')
MiProc;
...........
asi llamaras al procedimiento

espeor te sirva si no entendiste preguntas.

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE: Gracias maCo pero no anduvo!!!

Publicado por M@rceloL (213 intervenciones) el 07/07/2003 01:19:17
Che, maCo. Resulta que hice lo que me dijiste, pero no funcionó, la función nunca se ejecutó y me da un error de página nó válida.
El código es este:

[...]

type Tfunc=function(n:integer):integer;stdcall;

var
Form1: TForm1;
lib: cardinal;
func: tfunc;

implementation

{$R *.dfm}

[...]

procedure TForm1.Button1Click(Sender: TObject);
begin
lib:=loadlibrary('prueba1.dll');
@func:=getprocaddress(lib,'funcprueba');
showmessage(inttostr(func(10)));
freelibrary(lib);
end;

Si maCo o alguien sabe, les agradecería mucho me ayuden. Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE: Gracias maCo pero no anduvo!!!

Publicado por maCo (5 intervenciones) el 07/07/2003 21:06:55
parece que esta bien lo que pusiste.
pero te dara error si es que no esta la dll en la carpeta del exe o la carpeta del sistema, hasle debug y ve si los valores no son 0 para lib o nil para func.

por ultimo no creo que sea esto pero, tambien tienes que ponerla como stdcall a la funcion que exportas dentro de la dll
[...]
function funcprueba(n:integer): integer; stdcall;
begin
Result := n;
end;

exports
funcprueba;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE: Gracias maCo pero no anduvo!!!

Publicado por M@rceloL (213 intervenciones) el 08/07/2003 16:33:54
En realidad, puse la función en el programa sin stdcall y funcionó. ¿Tiene algo de malo?

Ya que estamos, y no te molesto más, estoy accediendo a las variables del programa desde la DLL, ¿Hay algún problema con eso? Hasta ahora no se me ha tildado, pero... uno nunca sabe.

Gracias por todo. Saludos y buenas compiladas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE: Gracias maCo pero no anduvo!!!

Publicado por maCo (22 intervenciones) el 10/07/2003 05:22:39
si, la conversion indica como se pasaran los parametros a la funcion o procedimiento.
si no estoy equivocado dephi usa por defecto la convension REGISTER que usa los registros eax, edx, ecx y el stack(PILA). y esa usas en la DLL, y el programa lo paso como STDCALL todos los parametros en stack.
por eso los dos deben usar los misma convension para que no haya problemas.

PD: la mayoria de APIs de windows usan la convension STDCALL que es usada por muchos compiladores
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar