Hola,
Un DLL se maneja diferente a una aplicación. Cuando usas un TDataModule tanto la creación del mismo como su destrucción debes hacerlo por tí mismo. Digamos que agregastes una unidad en la que creates tú TDataModule; ten en cuenta que al hacerlo, en realidad lo que estás definiendo es una clase descendiente de TDataModule, a la que llamastes Datos. Tú unidad debe lucir algo como esto:
Código Delphi
[-]
type
TDatos = class(TDataModule)
Private
FAlgo: Integer;
Public
Property Algo:Integer Read FAlgo Write FAlgo;
End;
Var
Datos: TDatos;
Lógicamente "Algo" es solo un ejemplo.
Hay varias consideraciones de metodología a hacer. Sin entrar en detalles, es aconsable borrar el :
De la unidad que has creado, y en su lugar emplearlo como variable local de la rutina que deba usarla; esto es para facilitar programación multihilos en caso de que más adelante se desarrolle con ella.
Las rutina que la use debe ser algo como esto:
Código Delphi
[-]
Function HacerAlgo(ACode:Integer):Integer;
Var
Datos: TDatos;
Begin
Datos := Nil;
Try
Datos := TDatos.Create(Nil);
Datos.Algo := ACode;
....
HacerAlgo := Datos.Algo;
Finally
Datos.Free;
End;
End;
El parámetro Nil del constructor le dice a la rutina que la responsabilidad de liberar al componente es de la propia rutina. Es importante que tengas en cuenta que aquí no puedas pasarle un parámetro Self, u otro componente, proveniente del programa principal porque se trata de áreas de memoria diferentes.
Bueno, hay bastante teoría que podríamos anotar al respecto; pero espero que esto te ayude a orientarte.
Ahora bien, te sugiero leer primero toda la teoría de manejo de DLLs y en especial la comunicación de parámetros entre el programa principal y el DLL, así como lo referente a manejo de memoria.