Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    13

    [C++] Usare funzioni da DLL

    Salve a tutti,
    Vi chiedo una mano per un problemuccio che sto avendo in questi giorni:
    Ho necessità di usare una funzione contenuta in un file DLL, questa funzione si chiama:
    Setting::TestFunction(void)
    non ho mai usato una DLL sto scrivendo questo programma per fare pratica e sono arrivato a questo punto:


    #include <iostream>
    #include <windows.h>

    typedef int (*AddFunc)(int,int);


    int main()
    {
    AddFunc _AddFunc;

    HINSTANCE hInstLibrary = LoadLibrary("Test.dll");



    if (hInstLibrary)
    {
    _AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "TestFunction(void)");
    std::cout << "Stampa funzione" << _AddFunc() << std::endl;
    }

    else
    {
    std::cout << "Non trovo il file Test.DLL" << std::endl;
    }



    std::cin.get();

    return 0;
    }


    Il mio problema è che non funzione, inoltre cosa più importante che non mi fa capire, è che anche se io cambio il nome della funzione mettendone una che nella DLL non c'è ottengo sempre la stessa cosa e quindi non so dove sbaglio,

    Spero l'argomento non sia già stato trattato, ho cercato bene nel forum ma non ho trovato nulla.



    Saluti

    Massimo
    WER180M

  2. #2
    codice:
    _AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "TestFunction");
    senza il (void), assumendo naturalmente che la dll esporti la funzione senza name mangling. Dopo la chiamata a GetProcAddress comunque verifica che _AddFunc sia diverso da NULL prima di tentare di richiamarla, per verificare appunto che la funzione esista.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    13
    Grazie mille MItaly,
    adesso ho risolto in parte nel senso che la funzione senza ricevere nulla mi dà 1 quindi ho risolto il codice, però non riesco a passargli il numero che dovrebbe processare,
    provo a inserire questo codice:

    se provo come esadecimale:
    std::cout << A4B3F607._AddFunc
    e il compilatore dice:
    hexadecimal floating constants require an exponent

    mentre se provo a passarglielo come numero:
    std::cout << 123456._AddFunc
    mi dice:
    invalid suffix "_AddFunc" on floating constant



    mi potete aiutare in questa parte?
    scusate, sicuramente la cosa è banale, ma sono anni che ormai non programmo più in C++
    WER180M

  4. #4
    Che senso ha quella roba? Devi passargli semplicemente due interi come parametri, come faresti con una qualunque funzione.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    13
    ah,
    però la funzione che io richiamo è: TestFunction(void)
    non dovrebbe prendere gli interi all'interno, in questo caso non si dovrebbe fare
    intero.TestFunction() ?
    o mi sbaglio?

    grazie per la pazienza MItaly
    WER180M

  6. #6
    Originariamente inviato da WER180M
    ah,
    però la funzione che io richiamo è: TestFunction(void)
    Tu l'hai dichiarata così:
    codice:
    typedef int (*AddFunc)(int,int);
    per cui prende due interi come argomenti e restituisce un intero.
    non dovrebbe prendere gli interi all'interno, in questo caso non si dovrebbe fare
    intero.TestFunction() ?
    o mi sbaglio?
    Ti sbagli. Il punto si usa per richiamare metodi sugli oggetti, e qui non c'entra niente.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    13
    Grazieeee!!!
    ecco l'errore! è che prima di decidermi a postare il problema era da giorni che smanettavo con questo codice.
    adesso riesco ad usare tutte le funzioni della DLL tranne quella, dato che nella DLL la funzione si chiama

    TestFunction(void)

    nel mio codice come la devo dichiarare?
    sto facendo delle prove, ma mi blocca tutto perchè sbaglio,
    ho provato a dichiararlo come:
    typedef int (*AddFunc)(void);
    o altre prove simili ma non hanno senso, come la dichiaro correttamente? e come la richiamo poi?

    MItaly ti dovrei fare una statua sei stato molto paziente, grazie mille
    WER180M

  8. #8
    Che tipo restituito ha la funzione nella dll? Puoi riportare il suo prototipo completo? Come esporti le funzioni dalla dll?
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    13
    La funzione restituisce un int, ma non ho il sorgerte in quanto è stata fatta da un mio amico qualche anno fa, era un suo vecchio progetto abbandonato e di cui rimangono pochi files, ormai lui non si occupa più di queste cose, comunque all'epoca scrisse la DLL in Borland C++.
    quindi non so altro se non il nome della funzione e che restituisce un intero
    WER180M

  10. #10
    Allora dovrebbe essere
    codice:
    typedef int (*TestFunction)(void);
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

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.