2009-09-08 11 views
8

Ho un'applicazione Delphi per cui ho scritto un wrapper .exe abbastanza semplice.Come si chiamano le funzioni Delphi in un bpl da un file eseguibile?

Fondamentalmente, c'era una DLL che aveva un sacco di funzioni, una delle quali avrei chiamato iterativamente una volta che il mio wrapper ha fatto quello che serviva. Non ho il controllo di questo file dll e non lo sarò mai.

Bene, ora questa DLL è una BPL e non sono sicuro di come chiamare le funzioni all'interno di quel file. Grazie in anticipo.

risposta

10

Il modo più semplice per utilizzare le funzioni di un pacchetto è "utilizzare" l'unità che contiene la funzione, chiamarla come al solito e inserire il pacchetto nell'elenco dei pacchetti di runtime del progetto. Perché ciò funzioni, ci sono alcuni requisiti:

  1. Il progetto deve utilizzare la stessa versione Delphi utilizzata per compilare il pacchetto.
  2. È necessario avere accesso al file DCU per l'unità o almeno al file DCP per il pacchetto.
  3. Il pacchetto deve esistere nel percorso di ricerca del sistema operativo all'avvio del programma.

Se non è possibile soddisfare il terzo requisito o se non si desidera che il pacchetto venga caricato sempre, è possibile chiamare invece lo LoadPackage. Il modo per farlo funzionare è quello di avere un altro pacchetto che sia caricato tutto il tempo. Sarà usato sia dal tuo progetto che dal pacchetto che desideri caricare. Il pacchetto intermedio esporrà un'interfaccia (come alcune funzioni di registrazione, una variabile o una classe) che il pacchetto principale può utilizzare per dire all'applicazione quali sono le sue funzioni. Non sarai in grado di "utilizzare" l'unità del pacchetto principale direttamente nella tua applicazione.

Se non riesci a soddisfare i primi due requisiti, c'è il modo più difficile, che è anche quello che dovresti fare se la tua applicazione non è scritta in Delphi o C++ Builder. Tratta il pacchetto come una normale DLL. Caricalo con LoadLibrary. Utilizzare GetProcAddress per caricare la sua funzione Initialize e quindi chiamarla. (Ricordare che la convenzione di chiamata è register, non stdcall.) Quindi caricare l'indirizzo della funzione che si desidera chiamare, tenendo presente che il nome della funzione è stato manomesso per includere alcune informazioni di unità e tipo. Chiamare la funzione Finalize prima di chiamare FreeLibrary. Controllare la fonte per LoadPackage e UnloadPackage; se è necessario chiamare CheckForDuplicateUnits probabilmente dipende dal fatto che sia possibile soddisfare il requisito numero 1.

+0

In qualsiasi modo puoi indicarmi una risorsa per farlo? In realtà non sono un programmatore Delphi, quindi sono a corto di alcune cose. – Dan

+0

Non sono a conoscenza di alcuna risorsa che descrive come caricare "manualmente" i pacchetti come descritto nel paragrafo finale. Il modo normale di usare i pacchetti, come descritto nel penultimo paragrafo, è qualcosa che mi aspetto di apparire nell'aiuto di Delphi, anche se non posso verificarlo da quando non ho installato Delphi da nessuna parte. –

2

Una BPL è solo una DLL con alcune aggiunte specifiche ad esso. Non dovresti avere problemi a chiamare le funzioni da esso proprio come hai fatto con la DLL, con un avvertimento specifico: la BPL deve essere costruita nella stessa versione di Delphi che stai usando. Questo può essere un grosso inconveniente se non si dispone del codice sorgente. Se questo è un problema per te, dovresti probabilmente parlare con chiunque lo abbia creato e chiedere loro di ritornare in una DLL.

+0

-1, non sono assolutamente d'accordo con l'idea "Torna a DLL-Inferno". Offrono un'interfaccia molto ricca e una gestione trasparente della memoria. –

+0

Indipendentemente dal fatto che ti piaccia o meno le implicazioni non cambia il fatto oggettivo che non puoi caricare una BPL da un eseguibile Delphi compilato con una versione diversa di Delphi. Se conosci un modo per farlo, sarei * molto * interessato a sapere come ... –

+0

I BPL possono certamente essere costruiti con una diversa versione di Delphi, se ci si attiene all'interfaccia DLL e ai tipi compatibili con DLL (senza stringhe per iniziare). – mghie

1

Una BPL può eliminare un sacco di problemi DLL. Se è possibile collegarlo staticamente, il bordo diventa quasi trasparente. Se è necessario caricarlo in modo dinamico, è necessaria una funzione di accesso in stile DLL (di solito una che restituisce un oggetto o un'interfaccia) e alcune definizioni di tipo (interfaccia) comuni. Tutto ciò che dovrebbe essere fornito dal produttore della BPL.

+0

Quale sarebbe il vantaggio di creare una "DLL che aveva un sacco di funzioni, una delle quali chiamerei" in una BPL? Nessuno dei vantaggi citati sembra avere importanza per l'OP. Forse non ha sofferto nessuno di quei problemi DLL? – mghie

+0

Dipende dai parametri di quella funzione. Mayb Dan può pubblicare una riga di intestazione. –

Problemi correlati