Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    [DELPHI] Inglobare una DLL in un eseguibile

    Salve,

    mi chiedevo se in Delphi 2005 fosse possibile fare un embedding all'interno dell'EXE di una DLL che non richiede registrazione nel Registry di Windows. Normalmente, installo tale DLL nella cartella del programma (quella in cui risiede l'EXE, appunto), ma mi piacerebbe poter fornire all'utente finale un unico file seguibile che contenga la DLL al suo interno.

    Sarà gradito qualsiasi suggerimento.
    http://www.espositosoftware.it

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Temo non sia possibile, a meno di non modificare il codice sorgente di entrambi (sempre se lo possiedi), inserendo il codice delle funzioni incluse nelle DLL - che ipoteticamente suppongo sia in una unit - nel progetto dell'applicazione, e rimuovendo poi la clausola external dalle funzioni in esame.

    Se si fosse trattato di package e non di DLL classiche, la soluzione sarebbe stata molto più immediata e drastica: era sufficiente rimuovere la spunta dall'opzione Build with runtime packages nelle opzioni del progetto e Delphi avrebbe automaticamente compilato il codice delle unit che formano il package direttamente nell'eseguibile, come avviene normalmente con il codice della libreria VCL (a meno di non abilitare, appunto, l'opzione di cui sopra).

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

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

  3. #3
    Peccato! Sapendo che in Delphi è possibile inglobare file WAV e animazioni GIF, mi ero illuso di poter fare altrettanto con le DLL. Grazie per la delucidazione.
    http://www.espositosoftware.it

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da esposito
    Peccato! Sapendo che in Delphi è possibile inglobare file WAV e animazioni GIF, mi ero illuso di poter fare altrettanto con le DLL. Grazie per la delucidazione.
    I suoni, le stringhe, le immagini e così via sono risorse, quindi sono incorporabili per natura, diciamo, e non solo in Delphi.

    I file DLL ed EXE sono invece "contenitori di codice macchina", quindi hanno una trattazione differente.

    Non so, poi, se la loro unione sia comunque possibile, magari ricorrendo a tool esterni che riescano a produrre una "scatola unica" che contenga entrambi gli elementi.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  5. #5
    Soluzioni possibili:

    1) Inserisci la DLL come risorsa e prima che le sue funzioni vengano richiamate la estrai nella cartella in cui risiede l'eseguibile. Al termine dell'esecuzione rimuovi la libreria. Ovviamente sorgono dei problemi se il tuo eseguibile non ha i privilegi per scrivere nella propria cartella.

    2) Usi programmi esterni, ad esempio PEBundle oppure Alloy.

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da pallinopinco
    Inserisci la DLL come risorsa e prima che le sue funzioni vengano richiamate la estrai nella cartella in cui risiede l'eseguibile. Al termine dell'esecuzione rimuovi la libreria. Ovviamente sorgono dei problemi se il tuo eseguibile non ha i privilegi per scrivere nella propria cartella.
    Su Windows Vista - ma non solo - una cosa del genere non verrebbe senz'altro vista di buon occhio (scusate il gioco di parole).

    Più che altro, mi chiedo che problema ci sia in fondo a rilasciare un software che è composto da un programma eseguibile e da una DLL? :master:

    In generale, al cliente finale sarebbe bene fornire un vero e proprio programma di installazione, generato ad esempio con i già noti Inno Setup, o InstallAware (distribuito ora con Delphi 2007).

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

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

  7. #7
    Sono a conoscenza di packagers come MoleBox (a proposito, PEBundle non viene più aggiornato dai suoi produttori, che ora consigliano di spendere migliaia di dollari per acquistare Thinstall), ma il problema è che molti antivirus individuano gli eseguibili così ottenuti come potenzialmente pericolosi.

    Il motivo per cui avrei preferito l'eseguibile autosufficiente al pacchetto di installazione è perché ciò avrebbe facilitato l'utilizzo in una LAN: sarebbe bastato mettere l'EXE in una cartella condivisa sul server e creare un semplice link all'eseguibile sulle varie postazioni della LAN.

    Ho trovato articoli interessanti che mostrano, ad esempio, come fare ad ingabbiare una pagina HTML in Delphi:

    http://delphi.about.com/od/interneti.../aa061901a.htm

    Tuttavia, nessuno spiega se è possibile referenziare una DLL inglobata in un eseguibile di Delphi.
    http://www.espositosoftware.it

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da esposito
    Sono a conoscenza di packagers come MoleBox (a proposito, PEBundle non viene più aggiornato dai suoi produttori, che ora consigliano di spendere migliaia di dollari per acquistare Thinstall), ma il problema è che molti antivirus individuano gli eseguibili così ottenuti come potenzialmente pericolosi.
    Sì, questo è un altro dei simpatici motivi per cui non adotterei questo genere di soluzioni.

    Originariamente inviato da esposito
    Il motivo per cui avrei preferito l'eseguibile autosufficiente al pacchetto di installazione è perché ciò avrebbe facilitato l'utilizzo in una LAN: sarebbe bastato mettere l'EXE in una cartella condivisa sul server e creare un semplice link all'eseguibile sulle varie postazioni della LAN.
    Se tu lasci la libreria DLL nella stessa cartella dell'eseguibile EXE, questa non viene vista?

    Originariamente inviato da esposito
    Ho trovato articoli interessanti che mostrano, ad esempio, come fare ad ingabbiare una pagina HTML in Delphi [...]
    Tuttavia, nessuno spiega se è possibile referenziare una DLL inglobata in un eseguibile di Delphi.
    Come si diceva prima, queste sono risorse, quindi sono elementi che devono necessariamente essere caricati per poter essere adoperati dal programma, mentre la DLL (se linkata staticamente) viene caricata da Windows al momento del lancio del programma.

    Una soluzione ci sarebbe: evitare il "link statico" alla DLL e provvedere a caricarla dinamicamente, determinando "al volo" gli indirizzi delle funzioni contenute in essa, memorizzando ciascun indirizzo in una variabile che appartenga al prototipo che identifica il numero e i tipi di parametri della funzione da richiamare e relativo il valore di ritorno.

    Questo delegherebbe al programma il compito di caricare la DLL dinamicamente, dal percorso che si preferisce (ma dovresti poi anche provvedere a rendere tale percorso facilmente configurabile, magari con un file esterno, quindi si complicherebbero le cose sotto altri punti di vista).

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

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

  9. #9
    Su Windows Vista - ma non solo - una cosa del genere non verrebbe senz'altro vista di buon occhio (scusate il gioco di parole).
    Nessun problema, il seguente codice crea il file pippo.dll estraendolo dalle risorse dell'eseguibile. Funziona perfettamente su Windows Vista e NON richiede neanche i privilegi di Amministratore:

    Codice PHP:
    Program Estrattore;

    uses WindowsClasses;

    {
    $R risorsa.res}

    var 
    res TResourceStream;

    begin
     res 
    := TResourceStream.CreateFromID(HInstance1RT_RCDATA);
     try
       
    res.SaveToFile('pippo.dll');
     finally
      
    res.Free;
     
    end;
    end

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da pallinopinco
    Nessun problema, il seguente codice crea il file pippo.dll estraendolo dalle risorse dell'eseguibile. Funziona perfettamente su Windows Vista e NON richiede neanche i privilegi di Amministratore:
    Se il programma risiede nella cartella dove generalmente si trovano i programmi, l'operazione non viene concessa a meno di non confermarla attraverso la finestra di dialogo prevista dall'UAC.

    Probabilmente, hai memorizzato l'eseguibile in questione in una cartella in cui hai i diritti per poter fare quanto hai descritto, e in ogni caso non si è tenuto conto di un problema: è necessario effettuare il "linking dinamico" alla libreria, altrimenti la DLL viene cercata subito da Windows e il codice che provvede alla sua estrazione dalle risorse non verrà eseguito, poiché verrà impedito al programma stesso di avviarsi, in quanto manca la DLL da cui il programma importa staticamente le funzioni.
    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 © 2024 vBulletin Solutions, Inc. All rights reserved.