Newsgroup: it.comp.lang.delphi
Titolo: Accedere a procedure pubbliche di una DLL direttamente da DLL

Ciao a tutti,
una domanda:
nella mia DLL ho creato alcune funzioni e procedure pubbliche
richiamabili da software esterni, e fino a qui nessun problema; ma è
possibile richiamarle anche direttamente da funzioni e procedure
esclusivamente interne alla DLL? Come?
Non so se mi sono spiegato.
Grazie in anticipo dell'aiuto

Non so se mi sono spiegato.
No, non ti sei spiegato. Se hai la funzione/procedura Pippo()
esportata, Pippo() è invocabile da qualunque programma carichi la DLL.
E' anche richiamabile da qualunque funzione/procedura dentro la DLL,
ovviamente (chi te lo vieta?).



Mmmmmm cercherò di essere più chiaro.
type
  TPassiveProtocol = class(TObject)
    ApdComPort1: TApdComPort;
  public
    Procedure DataTranslate(textMessage: PChar; Count: PChar);
  end;
Ho questa procedura interna alla DLL che non è richiamabile
dall'esterno.
Procedure DataTranslate(textMessage: PChar; Count: PChar);
Poi ho quest'altra Funzione richiamabile da altra applicazione, quindi
esportata.
Function CreateMessage(messageType: PChar; Add: PChar): PChar; export;
StdCall;
Come faccio da DataTranslate a richiamare la funzione CreateMessage?
Spero che sia piu chiaro ora.
Grazie

Come faccio da DataTranslate a richiamare la funzione CreateMessage?
Che vuol dire "come faccio a richiamare"? la richiami e basta.
Hai provato a chiamarla e non ci sei riuscito?
Hai avuto qualche errore?
Spiega! SPIEGA!!!



Allora, Se faccio in questo modo:
type
TPassiveProtocol = class(TObject)
   ApdComPort1: TApdComPort;
 public
   Procedure DataTranslate(textMessage: PChar; Count: PChar);
end;
Procedure TPassiveProtocol.DataTranslate(textMessage: PChar; Count:
PChar);
begin
.
.
.
  ApdComPort1.PutString(CreateMessage(PChar('Incorrect'),
CreateGID(PChar(Address)), CreateDID(PChar(Address))));
.
.
.
end;
Mi da errore dicendo che CreateMessage non è stata dichiarata.
Se invece la dichiaro così:
type
TPassiveProtocol = class(TObject)
   ApdComPort1: TApdComPort;
 public
   Procedure DataTranslate(textMessage: PChar; Count: PChar);
   Function CreateMessage(messageType: PChar; Add: PChar): PChar;
export; StdCall;
end;
Procedure TPassiveProtocol.DataTranslate(textMessage: PChar; Count:
PChar);
begin
.
.
.
  ApdComPort1.PutString(CreateMessage(PChar('Incorrect'),
CreateGID(PChar(Address)), CreateDID(PChar(Address))));
.
.
.
end;
Mi da errore nell'exports dicendo che non è stata dichiarata:
exports
CreateMessage;
Perchè? Qual'è il modo corretto da utilizzare?
Grazie di nuovo

 Perchè? Qual'è il modo corretto da utilizzare?
Non è per essere duro, ma sono sempre convinto - leggendo le tue domande 
- che tu stia utilizzando il linguaggio e l'ambiente di sviluppo che hai 
davanti con l'assoluta pretesa di poterlo fare senza documentarti, il 
ché potrebbe essere fattibile se nessuna difficoltà ti sbarra la strada, 
ma mi sembra che non sia questo il caso. :-|
Non conosci il significato di funzione/procedura statica, o di classe? 
Prendi un libro che ne parli e approfondisci le tue conoscenze in 
proposito, altrimenti molto spesso ti ritroverai pure in difficoltà 
nell'uso di termini impropri anche solo per spiegare il problema, non 
solo per risolverlo.
Ma sono convinto che questo suggerimento, come i precedenti, cadrà nel 
vuoto... :-)
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)


Uffa..lo so che hai ragione..piano piano sto imparando è solo che non
ho tutto sto tempo da dedicare al puro studio..appena mi riesce lo
faccio. Non vado sempre col paraocchi.
Beh comunque grazie. Vedrò di trovare una soluzione.
Ciao Marco :)

 Beh comunque grazie. Vedrò di trovare una soluzione.
Il problema più grosso, in questo caso, è che oltre a non rendere sempre 
comprensibili le richieste, difficilmente si riesce a formulare una 
valida risposta, perché non è possibile sapere quali sono gli elementi 
che hai già approfondito, e quali invece mancano.
Si finisce col darti un suggerimento di cui non puoi fare uso, a meno di 
non spiegare proprio tutto ciò che c'è da sapere, con il rischio di 
perdere tempo ad indicare qualcosa che sai già, o di tralasciare qualcosa.
Comprendo che lo studio, in generale, richieda del tempo, ma anche il 
fermarsi continuamente per un problema non mi pare sia diverso. :-|
Lo dico solo per cercare di farti capire anche le difficoltà di chi ti 
risponde, mica per altro. Non sono accanito. :-)


 end;
 > [...]
 > Mi da errore nell'exports dicendo che non č stata dichiarata:
Questo sembra avvalorare la mia ipotesi: trasformando la funzione
in un metodo sei stato costretto a dichiararla prima della sua
chiamata e quindi al momento della chiamata il compilatore non
ti dice che non la trova .
ciao
Giacomo