Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: [C++] Creazione DLL

  1. #1
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    [C++] Creazione DLL

    Ciao a tutti.

    Una semplice domandina che, per voi, sarà una banalità: come posso creare una semplicissima DLL in C++ (che possa essere usata in qualsiasi modo e forma, ad esempio, anche sotto VB)?
    Ho provato in molti modi, ma senza risultato.

    Se qualcuno potesse avere la magnanimità di postarmi un po' di codice, sarei grato: mi basterebbe una DLL che contenesse la funzione per il calcolo del fattoriale di un numero (per il resto, una volta capito come si fa, penso di essere in grado di arrangiarmi).

    La funzione, ad esempio, dovrebbe essere così:
    codice:
    long fattoriale(int valore) {
       return (valore <= 0) ? (long) 1 : (long) valore * fattoriale(valore - 1);
    }
    In tutte le salse in cui ho provato a crearla, il compilatore mi ha generato la DLL, ma quando ho provato a richiamarla da VB mi dava questo errore:
    "Impossibile trovare l'entry point per la funzione fattoriale".

    Grazie a tutti.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  2. #2
    Utente di HTML.it L'avatar di pixer
    Registrato dal
    Oct 2000
    Messaggi
    614
    hai provato con le ATL ?
    posta il codice.
    MySQL Worker - The OpenSource Multiplatform MySQL database Administrator (C++ powered)
    .:[ It resumes the development !! ]:.


  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ho provato a farglielo fare a Borland C++ Builder!!
    Il codice... ora non ce l'ho sotto mano, magari lo posto oggi pomeriggio.



    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quando si dice la velocità: ho trovato il codice.
    codice:
    #include <vcl.h>
    #include <windows.h>
    #pragma hdrstop
    
    #pragma argsused
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
            return 1;
    }
    
    long fattoriale(int valore) {
       return (valore <= 0) ? (long) 1 : (long) valore * fattoriale(valore - 1);
    }
    Dove sbaglio (perchè, di sicuro, sbaglio)?


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di pixer
    Registrato dal
    Oct 2000
    Messaggi
    614
    Originariamente inviato da LeleFT
    Dove sbaglio (perchè, di sicuro, sbaglio)?

    Ciao.
    L'hai definito l'entrypoint della funzione ?
    MySQL Worker - The OpenSource Multiplatform MySQL database Administrator (C++ powered)
    .:[ It resumes the development !! ]:.


  6. #6
    io ho provato così (codice dll):
    codice:
    /* mydll.dll */
    
    #include <windows.h>
    
    /* ENTRY-POINT */
    BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
    {
        return TRUE;
    }
    
    /* Funzione Somma */
    extern "C" __declspec(dllexport) int Somma(int a, int b)
    {
        return a+b;
    }
    Poi da C, la chiamo in questo modo (codice main.cpp):
    codice:
    #include <stdio.h>
    
    extern "C" __declspec(dllimport)int Somma(int a, int b);
    
    int main()
    {
        printf("%d\n", Somma(10, 5) );
        return 0;
    }
    P.s. da Visual Basic 6 non ho ancora provato...
    ...Terrible warlords, good warlords, and an english song

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da pixer
    L'hai definito l'entrypoint della funzione ?
    Bella domanda!! :gren:

    Se lo sapevo non postavo... il problema è che ho cercato informazioni su questo cavolo di sconosciuto entry point, ma senza risultati! E quando tento di richiamare la funzione da VB mi dice proprio che manca l'entry point della funzione... ma si può sapere cos'è sto entry point (posso anche averlo intuito) e, cosa più importante, COME SI DEFINISCE?

    Quello è TUTTO e SOLO il codice che ho scritto... se qualcuno mi posta un codice COMPLETO e funzionante, forse ci capirò di più.


    X Johnny_Depp: grazie mille... non appena avrò a disposizione il mio compilatore proverò il tuo esempio.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Ora funziona anche con Visual Basic!
    Modifica il codice aggiungendo WINAPI
    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;
    }
    da VB è sufficiente inserire in un modulo il seguente cod:
    codice:
    Declare Function Somma Lib "C:\directory_progetto\nome_della_dll.dll" (ByVal a As Long, ByVal b As Long) As Long
    ...Terrible warlords, good warlords, and an english song

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Purtroppo non ho a portata di mano il C++ Builder, quindi non posso effettuare delle prove, ma se funziona ti eleggo a mio Personalissimo Salvatore.

    Purtroppo, l'unico compilatore che ho a disposizione è il DevC++, che mi dà un bel Linker Error: undefined reference to WinMain@16...



    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    forse non ci crederai, ma ho compilato la dll
    proprio con DEV-C++!!! :master:

    Ricapitoliamo:
    1)creo un nuovo\progetto\ e seleziono "DLL" <-- (non console application o altro).

    2)L'ambiente DEV C++ di default crea oltre al file progetto (.dev),
    un file header (.h) ed un file c++ (.cpp) ed aggiunge ai due file anche del codice.
    A me il file header (.h) non serve!!! (ELIMINALO).

    3)Ora cancella TUTTO il codice all'interno del file (.cpp)
    ed inserisci (copia/incolla) quello che ho postato io sopra...
    Salva pure il file .cpp chiamandolo ad esempio "mydll.cpp"
    E compila... vedrai che ora l'errore non lo da più...
    (l'errore viene causato (quasi sicuramente) perchè tu crei un applicazione win32 console o win32 application... (non trova main() che difatti non c'è... non serve), ricorda che devi creare un progetto DLL)

    4)compila il file/progetto (.dev)... la DLL è pronta, (.dll)
    N.B.verrà creato anche un file (.lib) e un (.a) (<-- libreria specifica di Dev C++)
    Quest'ultimo sarà utile nel caso tu volessi provare
    la DLL chiamandola da un applicazione C/C++
    in tal caso il file libreria (.a) va linkato "progetto\opzioni\parametri\" al progetto chiamante...
    ma a noi ora non serve)

    5)N.B. la DLL non ha bisogno di essere registrata (con regsvr32 ...)
    basta che da Visual Basic, linki il percorso assoluto alla DLL
    come nell'esempio fatto sopra...

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

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.