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:
Graziecodice: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;

Rispondi quotando
Vuoi dire che non ho capito una fava e mi sono montato solo castelli di sabbia?
VVoVe:
Niente da fare, l'evento non viene associato.