Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [C] Creazione DLL

  1. #1
    Utente di HTML.it L'avatar di ARCTiC
    Registrato dal
    Sep 2002
    Messaggi
    2,814

    [C] Creazione DLL

    Salve, avrei un codice scritto in C che restituisce il risultato di alcune operazioni efettuate "su" di una serie di dati (e' un include .h). Avrei la necessita' di convertire tale codice in libreria per windows (.dll) in modo da poterla invocare da programmi esterni (in .vb), ho trovato alcuni esempi per il compilatore che utilizzo (devc++) ma capisco veramente poco di C, figuriamoci quindi di tutti i passaggi da fare per creare una DLL... c'e' un'anima pia che puo' darmi una mano? Grazie.
    In Vino Veritas, In Scarpe Adidas, In Bagno Badedas, In Culo un Ananas ©2003 ARCTiC

  2. #2
    ...Terrible warlords, good warlords, and an english song

  3. #3
    Utente di HTML.it L'avatar di ARCTiC
    Registrato dal
    Sep 2002
    Messaggi
    2,814
    GraZZie graZZZie! Sei il mio On.Salvatore... ora vado a provare... anche se ho il presentimento che finiro' per postare il codice e farmelo fare da qualcuno. ...perche' in C 'nce capisco una mazza!

    PS: il forum e' pure chiuso.. per fortuna c'eri in giro tu!
    In Vino Veritas, In Scarpe Adidas, In Bagno Badedas, In Culo un Ananas ©2003 ARCTiC

  4. #4
    Utente di HTML.it L'avatar di ARCTiC
    Registrato dal
    Sep 2002
    Messaggi
    2,814
    Te pareva... l'errore che impazza sui NG: "Unable to find an entry point...." su VB6.

    Ho provato il tuo codice, mi da errore:

    "Impossibile trova il punto di ingresso della DLL Somma in C:\dll.dll"

    Any idea?
    In Vino Veritas, In Scarpe Adidas, In Bagno Badedas, In Culo un Ananas ©2003 ARCTiC

  5. #5
    ok, da zero:
    ------------

    *)apri dev cpp.

    *)in dev cpp - menu': file\nuovo\progetto
    seleziona l'icona "DLL" (devi creare un tipo di progetto DLL) e cambia il nome di default, da "Progetto1" in "mydll" - tutto minuscolo - (seleziona il linguaggio "C++") e click su [OK] seleziona la directory in cui vuoi salvare il progetto (DLL) e fai click su [salva] (il nome del file progetto - in questo caso -sarà: "mydll.dev"

    *)Automaticamente verranno creati DUE files (oltre al file progetto "mydll.dev", uno c++, chiamato (di default) "dllmain.cpp"
    e l'altro header, chiamato (sempre di default) "dll.h"

    *)Il file "dll.h" non ti serve.
    Chiudilo senza salvarlo così verrà automaticamente rimosso
    anche dal progetto.

    *)Il file "mydll.cpp" ti serve.
    Cancella tutto il codice inserito di default... (devi ottenere
    un foglio bianco) ed inserisci (copia/incolla) questo codice:
    codice:
    #include <windows.h>
    
    WINAPI BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
    {
        return TRUE;
    }
    
    extern "C" __declspec(dllexport) WINAPI int Somma(int a, int b)
    {
        return a+b;
    }
    *)Ora, salva il file "dllmain.cpp" RINOMINANDOLO in "mydll.cpp"

    *)Click su compila! (verrà creata la DLL (in questo caso) "mydll.dll"
    e gli altri file relativi al progetto/dll)

    *)Chiudi pure il progetto, la DLL è pronta.
    ---------------------------------------------------

    SE VUOI TESTARE LA DLL DA C/C++:

    *)Apri di nuovo DevC++ e crea un NUOVO progetto
    (questa volta di tipo "Console Application"
    e salvalo con il nome di "main.dev"
    verrà creato di default (oltre al file progetto: "main.dev")
    un file sorgente: "main.cpp", cancella tutto il suo contenuto (codice)
    e inserisci (copia/incolla) questo:
    codice:
    #include <stdio.h>
    #include <stlib.h>
    
    extern "C" __declspec(dllimport)int Somma(int a, int b);
    
    int main()
    {
        printf("%d\n", Somma(10, 5) );
        system("pause");
        return 0;
    }
    *)Un'ultima cosa, vai su: Menù "Progetto\Opzioni di progetto\
    Finestra "PARAMETRI" e (nel riquadro "LINKER")
    [aggiungi libreria]... inserisci/Linka la DLL appena creata, in DevC++ si chiama "libmydll.a" (invece di "mydll.dll") poi click su [OK].

    *)Salva tutto e compila il progetto, ora funziona!
    ----------------------------------------------------------------------

    P.s. per richiamare la libreria da VB prendi il codice dal link che trovi sopra.

    GoodNight
    ...Terrible warlords, good warlords, and an english song

  6. #6
    Utente di HTML.it L'avatar di ARCTiC
    Registrato dal
    Sep 2002
    Messaggi
    2,814
    Ho risolto (quasi...). Il dannato mangling e' il colpevole: il compilatore esporta le funzioni con tutti gli gingilli del "C" appresso, e non c'e' stato verso di eliminarlo (almeno io non ci sono riuscito), nemmeno compilando il progretto a mano da console. L'entry point alla routine quindi (nel mio caso) non si chiama "Somma" ma "Somma@8" (@8 indica l'allocazione necessaria). Alla fine ho dovuto creare un Alias nella dichiarazione della libreria in VB, perche' non si possono usare caratteri "speciali" nel nome:

    Declare Function Somma Lib "C:\directory_progetto\nome_della_dll.dll" Alias "Somma@8" (ByVal a As Long, ByVal b As Long) As Long

    Adesso PARE tutto funzionare, ma per esserne sicuro dovrei dare in mano il codice a qualcuno che ne capisce un minimo di "C" (e che faccia tutto per bene) in modo da poter verificare che i risultati che ottengo siano esatti (ci sono un tot di funzioni matematiche dentro... e non ho modo di verificare che il risultato sia corretto se non con un confronto).... se ti invio l'include originale (non e' necessario farlo diventare una libreria) e ti mando una sequenza di dati di prova potresti restituirmi il risultato?
    Grazie.
    In Vino Veritas, In Scarpe Adidas, In Bagno Badedas, In Culo un Ananas ©2003 ARCTiC

  7. #7
    ok, manda pure a gab_col@tin.it

    p.s. cmq, se hai Excel a testare le "funzioni matematiche" non ci metti nulla.
    ...Terrible warlords, good warlords, and an english song

  8. #8
    Utente di HTML.it L'avatar di ARCTiC
    Registrato dal
    Sep 2002
    Messaggi
    2,814
    L'errore e' nel passaggio dei parametri, non riesco a inviare la stringa intera.. arrivano solo un certo numero di bytes e non so dove sbaglio, ho fatto questo codice di prova per verificarlo:

    extern "C" __declspec(dllexport) u_long WINAPI Somma(char pck_no)
    {
    u_char pck[] = "mypacket";
    return sizeof(pcka);
    }

    Assegno a mano la stringa e mi ritorna in VB il numero "9" (che e' corretto.. e' la lunghezza del pacchetto piu' la terminazione).
    Con questo invece:

    extern "C" __declspec(dllexport) u_long WINAPI Somma(char pcka)
    {
    return sizeof(pcka);
    }

    Mi ritorna "1" ...in pratica gli arriva solo il primo byte e non tutta la stringa che gli passo da VB (ho gia' provato a dichiararla di lunghezza fissa e pure a terminarla con chr$(0) ma niente). Dov'e' che sbaglio?
    In Vino Veritas, In Scarpe Adidas, In Bagno Badedas, In Culo un Ananas ©2003 ARCTiC

  9. #9
    Utente di HTML.it L'avatar di ARCTiC
    Registrato dal
    Sep 2002
    Messaggi
    2,814
    Mi rispondo da solo: ho "scoperto" che e' impossibile passare stringhe via DLL, ma solo singoli bytes (caratteri) o il puntatore alla memoria della variabile... perche' i dati sono sempre numerici.
    La domanda pero' resta valida: come risolvo?
    In Vino Veritas, In Scarpe Adidas, In Bagno Badedas, In Culo un Ananas ©2003 ARCTiC

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.