1. use sharemem;
  2. in dll project, define like this:
     TBaseClass = Class(TObject)
     public
       procedure DoSomething; virtual; 
     end;
     but ,in normal project , we should define like this:
     TBaseClass = Class(TObject)
     public
       procedure DoSomething; virtual; abstract;
     end;
   3. call like this
     var
       AObject: TBaseClass;
     begin
       AObject := TBaseClass(GetBaseClass); // GetBaseClass is a function provided by dll project;
       // use it like other normal object
       AObject.Free;
     end;