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