Ciao Alka,
finalmente sono riuscito a creare i miei oggetti nella DLL direttamente da codice, ti inserisco comunque il sorgente in modo che tu possa controllarlo e dirmi se ci sono errori di concetto. Ti assicuro che tutto il codice inserito non è frutto di immaginazione o tentativi come facevo fino a poco tempo fa, oggi ho avuto l'illuminazione e quello che ho scritto l'ho capito. Il problema principale ora è capire come gestire gli eventi, questo ancora mi è ignoto anche se un'idea ce l'avrei, in più quando chiudo il form dopo aver richiamato la funzione Connect() e DownloadPollingNEW() (e nient'altro) mi da errore di access violation. Puoi fare luce nel buio della mia mente?

Il codice di base della DLL è questo:
codice:
type
  TPortCom = class //creo una nuova classe
    ApdDataPacket1: TApdDataPacket; //assegno alla classe l'oggetto figlio
    ApdComPort1: TApdComPort; //assegno alla classe l'oggetto figlio
  public
    constructor Create(AOwner: TComponent); //assegno il costruttore
    destructor Destroy; override; //assegno il distruttore
    procedure ApdDataPacket1StringPacket(Sender: TObject; Data: string); //assegno l'evento che però non funziona
  end;

constructor TPortCom.Create(AOwner: TComponent); //procedura richiamata dal costruttore al comando TPortCom.Create()
begin
  ApdComPort1 := TApdComPort.Create(nil); //creo l'oggetto ApdComPort1
  ApdDataPacket1 := TApdDataPacket.Create(nil); //creo l'oggetto ApdDataPacket1
end;

destructor TPortCom.Destroy; //procedura richiamata per la distruzione della classe
begin
  FreeAndNil(PortCom.ApdComPort1); //libero la memoria di ApdComPort1
  FreeAndNil(PortCom.ApdDataPacket1); //libero la memoria di ApdDataPacket1
  ApdComPort1.Destroy; //distruggo l'oggetto
  ApdDataPacket1.Destroy; //distruggo l'oggetto
end;

procedure TPortCom.ApdDataPacket1StringPacket(Sender: TObject; Data: string);
begin
Prova := Trim(Data);
end;

Function DownloadPollingNEW(ADD: PChar; IDBOX: PChar): PChar; export; StdCall;
 var
  Response    : String;
  VerifyXor     : Byte;
  I                : Integer;
begin
      FreeAndNil(Response);
      Try
      //Invio il carattere EOT di chiusura per evitare trasmissioni aperte precedentemente
      PortCom.ApdComPort1.PutString(chr($04));
      //Invio la stringa di Polling: [SOH][GID][DID][ENQ] che in esadecimale diventa [01][41][?][05]
      PortCom.ApdComPort1.PutString(chr($01)+ADD+IDBOX+chr($05));
      PortCom.ApdDataPacket1.ComPort := PortCom.ApdComPort1;
      PortCom.ApdDataPacket1.StartCond := scString;
      PortCom.ApdDataPacket1.StartString := #2;
      PortCom.ApdDataPacket1.EndCond := [ecString];
      PortCom.ApdDataPacket1.EndString := #3+'?';
      //Alloco memoria per contenere il valore di ritorno della funzione da passare al software
      if Prova <> '' then
        Response := Prova
      else
        Response := 'Nessun dato';
      GetMem(Result,Length(Response));
      //Copio il valore di ritorno nella variabile che la funzione ritorna
      Result := StrPCopy(Result, Response);
      //Result := PChar(Response);
      Except
      //Alloco memoria per contenere il valore di ritorno della funzione da passare al software
      GetMem(Result,StrLen('ERROR'));
      //Copio il valore di ritorno nella variabile che la funzione ritorna
      Result := StrPCopy(Result, 'ERROR');
      end;
end;

Procedure Connect(Baud: PChar; COM: PChar) export; StdCall; //Procedura richiamata dal software esterno
begin
  PortCom := TPortCom.Create(nil); //Creo la classe e i suoi oggetti
  try
  //Configuro la porta seriale e la apro per iniziare le comunicazioni
    PortCom.ApdComPort1.ComNumber := StrToInt(COM);
    PortCom.ApdComPort1.Baud := StrToInt(Baud);
    PortCom.ApdComPort1.Parity := pNone;
    PortCom.ApdComPort1.DataBits := 8;
    PortCom.ApdComPort1.StopBits := 1;
    PortCom.ApdComPort1.InSize := 256;
    PortCom.ApdComPort1.Open := true;
    Conn := true;
  except
    FreeAndNil(PortCom.ApdComPort1);
  end;
end;

Procedure Disconnect() export; StdCall;
begin
  PortCom.ApdComPort1.open := false;
  FreeAndNil(PortCom.ApdComPort1);
  FreeAndNil(PortCom.ApdDataPacket1);
  Conn := false;
end;
Grazie