En lo personal poco es lo que he usado los dll, quizás para funciones menores en el programa. Y es quizás por que las funciones mayores requieren de conexiones a bases de datos y cosas por el estilo, para lo cual prefiero que estén dentro del programa principal para implementar una sola conexión.
Además de estos, el paso de parámetros está condicionado, sobretodo, en el manejo de strings. Mientras que es más fácil declarar una variable como String, para pasarlo como parámetro a una función o procedimiento en un dll, hay que pasarla como ShortString o como PChar, lo cual hace que tengas que limitar dichas funciones o hacer programación adicional para cumplir con estas reglas.
Todo esto, además de considerar que las dll's son una especie (finalmente) en peligro de extinsión, toda vez que la importación de componentes externos se está mudando a los tbl.
En fin, luego de la leve introducción, he de decir que el manejo de dll's es más sencillo de lo que en un principio parece.
Crear una dll se limita a crear un proyecto dll. Yo, como te digo, lo único que he hecho es hacer procedimientos menores y lo que hago es generar dichos procedimientos y luego declararlos en la sección exports. Luego de eso, en mi programa los importo y listo.
Así, los proyectos dll se ven de esta manera:
library Libreria;
uses
SysUtils, Classes, ...;
procedure Primero(...); stdcall;
begin
...
end;
procedure Segundo(...); stdcall;
begin
...
end;
function Tercero(..):...; stdcall;
begin
...
end;
...
exports
Primero, Segundo, Tercero;
begin
end.
Y en mi programa principal (donde normalmente tengo una unidad con varias constantes globales y esas cosas), declaro las funciones y procedimientos a importar de la siguiente manera:
procedure Uno(...); stdcall; extermal 'Libreria.dll' name 'Primero';
procedure Segundo(...); stdcall; external 'Libreria.dll' name 'Segundo';
function Tres(...)...; stdcall; external 'Libreria.dll' name 'Tercero';
Con esto logro utilizar sin problemas los procedimientos almacenados en la dll, aunque haciéndolo así sé que la dll se carga desde el inicio del programa y no cada vez que llamo a alguno de los procedimientos... pero hoy que las memorias de 1Gb cuestan 50uds, quien cuenta bytes?
Saludos.