Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C/C++] collegare una dll al progetto

    Ciao a tutti, ho un piccolo problema, seguendo alcune guide che ho trovato su internet, sono riuscito a creare una DLL con le mie funzioni all'interno, utilizzando Dev-c++. Ora la dll c'è, (sinceramente spero sia corretta), ma vorrei utilizzarla all'interno dei miei progetti, delle mie applicazioni. Come posso fare a linkare la libreria da c++ builder, da dev-c++, da vb ecc...???

    grazie


    ciao


    ps: qualcuno può spiegarmi cos'è una libreria .a ???

  2. #2

    up

    up

  3. #3
    Utente di HTML.it L'avatar di Fox82
    Registrato dal
    Feb 2002
    Messaggi
    459
    Una dll è una libreria a collegamento dinamico; ne esiste cioè un'unica copia, gestita dal SO ed esterna ai programmi che ne fanno uso, che viene caricata nello spazio di memoria del processo che la utilizza.

    Una libreria statica (.lib o .a) invece viene inserita (linkata) direttamente dentro l'eseguibile, ed entra a far parte di esso in tutto e per tutto.

    Ovviamente le prime hanno il vantaggio di conservare una sola copia del codice sorgente, a fronte però di un leggero overhead per la loro gestione.

    Per collegare una dll ad un progetto, puoi agire in due modi:

    - utilizzare la libreria statica corrispondente, che si occupa di caricare automaticamente la dll dallo spazio di memoria del processo

    - occuparti tu manualmente del caricamento tramite le API


    Caso 1: durante la compilazione della dll avrai sicuramente ottenuto un file (.a o .lib a seconda del compilatore); inserendola dentro il processo avrai automaticamente accesso a tutti i metodi della dll.

    Caso 2: devi conoscere un po di programmazione Windows, comunque tramite la funzione LoadLibrary crei un riferimento alla dll con il quale puoi ottenere ulteriori riferimenti ai metodi che ti servono (al momento non ricordo bene la funzione che serve per "agganciare" i metodi)

    Con il secondo metodo ovviamente hai più controllo, pupi caricare la libreria solo quando ti serve (se ti serve) e rimuoverla quando non ti serve più

    Spero di aver chiarito un po di dubbi.

    Linux user number 403381

    Stop TCPA!

  4. #4
    Originariamente inviato da Fox82
    Una dll è una libreria a collegamento dinamico; ne esiste cioè un'unica copia, gestita dal SO ed esterna ai programmi che ne fanno uso, che viene caricata nello spazio di memoria del processo che la utilizza.

    Una libreria statica (.lib o .a) invece viene inserita (linkata) direttamente dentro l'eseguibile, ed entra a far parte di esso in tutto e per tutto.

    Ovviamente le prime hanno il vantaggio di conservare una sola copia del codice sorgente, a fronte però di un leggero overhead per la loro gestione.

    Per collegare una dll ad un progetto, puoi agire in due modi:

    - utilizzare la libreria statica corrispondente, che si occupa di caricare automaticamente la dll dallo spazio di memoria del processo

    - occuparti tu manualmente del caricamento tramite le API


    Caso 1: durante la compilazione della dll avrai sicuramente ottenuto un file (.a o .lib a seconda del compilatore); inserendola dentro il processo avrai automaticamente accesso a tutti i metodi della dll.

    Caso 2: devi conoscere un po di programmazione Windows, comunque tramite la funzione LoadLibrary crei un riferimento alla dll con il quale puoi ottenere ulteriori riferimenti ai metodi che ti servono (al momento non ricordo bene la funzione che serve per "agganciare" i metodi)

    Con il secondo metodo ovviamente hai più controllo, pupi caricare la libreria solo quando ti serve (se ti serve) e rimuoverla quando non ti serve più

    Spero di aver chiarito un po di dubbi.

    Il primo metodo io non l'ho mai usato e non lo conoscevo nemmeno,saresti così gentile da speigarlo più nel dettaglio magari con un esempio?In particolare cosa intendi per "inserendola dentro il processo" ? Thanks!
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  5. #5
    Utente di HTML.it L'avatar di Fox82
    Registrato dal
    Feb 2002
    Messaggi
    459
    Scusa, ho sbagliato termine, intendevo "dentro il progetto".

    Comunque è il modo più semplice, probabilmente lo conosci e non mi sono spiegato bene io.
    La libreria che ottieni dalla compilazione della dll contiene il codice che si occupa del caricamento della dll nello spazio di memoria del processo. Se linki questa libreria le funzioni contenute nella dll sono disponibili automaticamente.
    Linux user number 403381

    Stop TCPA!

  6. #6
    Originariamente inviato da Fox82
    Scusa, ho sbagliato termine, intendevo "dentro il progetto".

    Comunque è il modo più semplice, probabilmente lo conosci e non mi sono spiegato bene io.
    La libreria che ottieni dalla compilazione della dll contiene il codice che si occupa del caricamento della dll nello spazio di memoria del processo. Se linki questa libreria le funzioni contenute nella dll sono disponibili automaticamente.
    Ok
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    All'interno di un file PE (Portable Executable), ovvero del normale file exe Win32, esiste una tabella, la "Import Directory" in cui il linker deposita il nome delle DLL "implicitamente collegate" e tutti gli ordinali delle funzioni di tali DLL usate dall'eseguibile.

    Questo avviene indicando al linker il nome delle .lib corrispondenti alle dll da utilizzare, ovviamente, con la precisazione che il collegamento sia comunque dinamico e non statico.

    In questo modo le lib non vengono collegate staticamente ma servono per ricavare le informazioni che andranno inserite nelle Import Directory del file PE.

    Quando il loader del PE di Windows, carica in memoria l'eseguibile, esplora la Import Directory. Se una dll elencata in questa tabella non e' ancora presente in memoria, viene caricata e vengono risolti tutti gli offset, altrimenti ottiene l'indirizzo base del caricamento per aggiustare gli offset.

    Quando non si ha a disposizione la .lib corrispondente, le funzioni della DLL possono essere utilizzate con il consueto metodo della LoadLibrary, ma di questo non se ne occupera' automaticamente il loader ma il programma stesso.

  8. #8
    Originariamente inviato da oregon
    All'interno di un file PE (Portable Executable), ovvero del normale file exe Win32, esiste una tabella, la "Import Directory" in cui il linker deposita il nome delle DLL "implicitamente collegate" e tutti gli ordinali delle funzioni di tali DLL usate dall'eseguibile.

    Questo avviene indicando al linker il nome delle .lib corrispondenti alle dll da utilizzare, ovviamente, con la precisazione che il collegamento sia comunque dinamico e non statico.

    In questo modo le lib non vengono collegate staticamente ma servono per ricavare le informazioni che andranno inserite nelle Import Directory del file PE.

    Quando il loader del PE di Windows, carica in memoria l'eseguibile, esplora la Import Directory. Se una dll elencata in questa tabella non e' ancora presente in memoria, viene caricata e vengono risolti tutti gli offset, altrimenti ottiene l'indirizzo base del caricamento per aggiustare gli offset.

    Quando non si ha a disposizione la .lib corrispondente, le funzioni della DLL possono essere utilizzate con il consueto metodo della LoadLibrary, ma di questo non se ne occupera' automaticamente il loader ma il programma stesso.
    Allora vediamo se ho capito,in effetti queste cose le conosco solo superficialmente:
    1)la dll contiene il codice vero e proprio delle funzioni della libreria
    2)la lib idem
    3)la dll può essere linkata dinamicamnete all'exe in due modi o da codice con loadlibrary o mediante parametri al linker che gli indichino la lib corrispondente e che gli indichino di effettuare un link dinamico.
    4)la lib può anche essere usata per un link statico e quindi "iniettata" nell'exe con tutto il codice delle funzioni

    Correggetemi se ho sbagliato in qualche punto.
    Ora se è tutto giusto mi chiedo: ma allora se la lib la uso per un caricamento dinamico ho insieme lo svantaggio di un aumento di dimensione del programma e l'overhead del caricamneto dinamico? Oppure in questo secondo caso il linker si limita ad inserire nell'exe solo alcune informazioni (relative alla dll) contenute nella lib?
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Originariamente inviato da unomichisiada
    Allora vediamo se ho capito ...
    Ok

    Originariamente inviato da unomichisiada
    ... se la lib la uso per un caricamento dinamico ho insieme lo svantaggio di un aumento di dimensione del programma e l'overhead del caricamneto dinamico? Oppure in questo secondo caso il linker si limita ad inserire nell'exe solo alcune informazioni (relative alla dll) contenute nella lib?
    La seconda ...

    In questo caso, al linker la lib non serve per prendere il codice e inglobarlo nell'eseguibile ma soltanto per ottenere nome della dll e ordinale delle funzioni e delle dipendenze da introdurre nella Import Directory.

  10. #10
    Originariamente inviato da oregon
    Ok



    La seconda ...

    In questo caso, al linker la lib non serve per prendere il codice e inglobarlo nell'eseguibile ma soltanto per ottenere nome della dll e ordinale delle funzioni e delle dipendenze da introdurre nella Import Directory.
    Perfetto, lo sospettavo perchè il buon senso mi diceva così ma in effetti non ne ero sicuro.Grazie a entrambi dei chiarimenti.
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

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.