Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    32

    [Delphi] [Generico] Creazione e utilizzo dll

    Salve a tutti,
    ho un dubbio per quanto riguarda nozioni generali sulla creazione e sul richiamo di dll e in particolar modo su come in Delphi si utilizzano.

    Preciso che ho gia "studiato" alcune cose sulle dll. Riesco ad esempio a costruire una dll contenente delle semplici funzioni che ad esempio effettuano dei calcoli matematici e ne rendono i risultati all'eseguibile chiamante... e fin qui tutto bene. Ma quando provo a far aprire un Form dalla dll ecco i pasticci; il form non si apre e si blocca l'applicazione generando errori di inizializzazione dell'applicazione ed errori di memoria (Esempio: ...la memoria non poteva essere Read...).

    Sia l'eseguibile chiamante sia la dll sono sviluppati con Delphi 6.
    La dll è richiamata col metodo statico.

    Cosa sbaglio? Se il discorso è troppo vasto, avreste da consigliarmi qualche link interessante?
    Grazie anticipatamente.

    FiFFiO
    A questo mondo ci sono 10 persone:
    quelli che capiscono il codice binario e quelli che non lo capiscono.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Gli errori che ottieni nell'uso di DLL contenenti form all'interno dell'applicazione sono principalmente dovuti al memory manager di Delphi (risolvibile inserendo ShareMem nella clausola uses di entrambi i progetti) e alle modalità con cui le form vengono trattate dall'oggetto Application.

    Prova a leggere questo articolo per vedere se contiene indicazioni interessanti per risolvere i tuoi problemi.

    Io faccio generalmente uso di package per contenere i form utilizzati dall'applicazione, anche se questo preclude l'uso di quei form da parte di ambienti di sviluppo diversi da Delphi.

    Se hai altri dubbi specifici, scrivi di nuovo.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    32
    Grazie per la tempestiva risposta...

    Ho aggiunto ShareMem ma altri problemi in esecuzione
    Ho riprovato a scrivere una semplice dll ed eseguibile ma mi da errori di memoria in chiusura di programma!
    Precisamente in debugging mi dice "project richiamalib.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'. Process stopped... "

    Copio il sorgente di entrambi qui di seguito. Se non riesco a far funzionare nemmeno una cosa così semplice non posso sperare di realizzare il mio progetto, già per altro abbastanza ben definito.

    Ti anticipo che questo mio esempietto fa rendere dalla funzione della dll un valore che sarà poi inserito in un Label.Caption, in questo modo verifico (e funziona) se il tutto realmente parte.

    ########### Unit1 dell'eseguibile #############
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ShareMem;

    type
    TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;
    function apri:integer; external 'apriform.dll';

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Label1.Caption:= IntToStr(apri);
    end;

    end.

    ################## dll ########################
    library apriform;

    uses
    SysUtils,
    Classes,
    ShareMem;

    {$R *.res}

    var
    x : integer;

    function apri:integer;
    begin
    x := 5;
    Result := x;
    end;

    exports
    apri;

    begin
    end.
    ##########################################

    Grazie per l'attenzione.

    FiFFiO
    A questo mondo ci sono 10 persone:
    quelli che capiscono il codice binario e quelli che non lo capiscono.

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    La unit ShareMem va inserita 1 sola volta e per prima nelle clausole uses del progetto (file DPR) in entrambi i sorgenti (eseguibile e libreria) quando hai a che fare con tipi di dati che vengono gestiti dal memory manager, come le stringhe (string).

    Se crei una nuova DLL, troverai un commento nel sorgente che ti spiega il meccanismo.

    Nell'esempio che mi hai fornito non vedo errori eclatanti, sebbene suggerirei di non usare variabili globali nella libreria ma solamente locali alle singole procedure, almeno in questo caso di esempio, tanto per escludere possibili problemi.

    Per valori interi, ShareMem non serve, quindi il problema è da ricercarsi altrove.

    Un primo suggerimento che ti dò è questo: controlla sempre dove metti le librerie (DLL) compilate per non rischiare di avere più versioni sparse per il disco che magari ti conducono ad una situazione in cui compili e aggiorni una DLL, ma di fatto ne utilizzi un'altra.

    L'eccezione EInvalidPointer è senz'altro dovuta a qualcos'altro...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    32
    Originariamente inviato da alka
    Un primo suggerimento che ti dò è questo: controlla sempre dove metti le librerie (DLL) compilate per non rischiare di avere più versioni sparse per il disco che magari ti conducono ad una situazione in cui compili e aggiorni una DLL, ma di fatto ne utilizzi un'altra.
    Si, sono sicuro che la dll è quella in quanto le altre release le cancello sempre...

    Vedo sfumare il mio progetto di realizzazione software in quanto il problema è da ricercarsi in qualcosa di piu grosso...

    Mi servirebbe davvero un corso come il vostro sul Delphi, peccato solo che mi trovo in sardegna e che studio ancora all'università!

    Al momento studierò dal web e cerchero' di accontentarmi

    Grazie ancora. :tongue:

    FiFFiO
    A questo mondo ci sono 10 persone:
    quelli che capiscono il codice binario e quelli che non lo capiscono.

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Non scoraggiarti!

    Se ho un attimo di tempo, provo a produrti un esempio di applicazione e DLL con l'uso di un form, magari riportando successivamente qui alcuni accorgimenti e peculiarità a riguardo per chi si trova a fronteggiare lo stesso problema.

    Basta avere pazienza perchè purtroppo il lavoro incombe...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    32
    Sei gentilissimo, ti ringrazio per la disponibilità.

    FiFFiO
    A questo mondo ci sono 10 persone:
    quelli che capiscono il codice binario e quelli che non lo capiscono.

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Ho pubblicato un esempio di utilizzo a questo indirizzo.

    Si tratta di un file ZIP che contiene due progetti d'esempio, un'applicazione e una libreria, con un Project Group che permette di aprire entrambi i progetti e compilarli per verificarne il funzionamento.

    E' incluso un file Leggimi.txt con alcune istruzioni.

    Per dovere di cronaca data la policy del forum, il file ZIP non include eseguibili o binari, ma solo file sorgente in formato testo realizzati con Delphi 7 Professional.

    In realtà, sebbene funzionante, si tratta di un esempio parziale poichè esigenze avanzate di incapsulazione per quanto riguarda l'argomento "form in DLL" potrebbero richiedere ulteriori modifiche e alterazioni delle opzioni predefinite di compilazione.

    In generale, suggerisco l'uso di package runtime per contenere delle form, altrimenti l'opzione "Build with runtime packages" deve essere abilitata; inoltre, l'applicazione di riferimento (oggetto Application) della libreria deve essere reimpostato con una procedure apposita affinchè punti allo stesso oggetto Application usato dall'applicazione, prima di utilizzare qualsiasi risorsa nella libreria stessa (form, frame e altro).

    Con l'uso di package, questa necessità non si presenta, o meglio è gestita in automatico da Delphi.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2003
    Messaggi
    32
    Grazie Marco,

    seguirò i tuoi consigli e mi cimenterò per qualche giorno ad effettuare prove sfruttando il tuo eccellente esempio.

    Finalmente è comparso uno spiraglio di luce fra le oscure conoscenze sulle dll :tongue:
    Ancora grazie!

    A presto

    FiFFiO
    A questo mondo ci sono 10 persone:
    quelli che capiscono il codice binario e quelli che non lo capiscono.

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Posso solo dirti che l'uso di DLL e packages è frequente in Delphi, quindi l'unico problema che si pone è imparare ad utilizzarle e cercare della documentazione.

    Un minimo di sforzo per ottenere buoni risultati devi metterlo in conto.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.