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

    [C/C++] Problema con dll

    Salve a tutti.
    Non so usare le dll in C++.
    ho usato l'ide visual studio 6.0 ed hos eguito dei consigli in rete.
    Eccovi i miei codidi

    DLL.cpp
    codice:
    // DLL.cpp : Defines the entry point for the DLL application.
    //
    
    #include "stdafx.h"
    
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
    					 )
    {
        return TRUE;
    }
    
    extern "C" int __declspec(dllexport)  Somma(int a, int b)
    {
    
    return a+b;
    }
    Questo invece è il file di prova che la dovrebbe usare
    codice:
    void main()
    {
    HMODULE Hl = LoadLibrary("C:\\DLL\\Debug\\Dll.dll");
    cout<<"Handle alla libreria \"C:\\DLL.dll\"\n"<<Hl<<"\n";
    cout<<"Indirizzo funzione esportata \"Somma\"\n"<<GetProcAddress(Hl,"Somma")<<"\n";
    cout<<"Indirizzo funzione esportata \"Pippo\" (Non esiste)\n"<<GetProcAddress(Hl,"Pippo")<<"\n";
    int (*ptr)(int,int);
    ptr=GetProcAddress(Hl,"Somma");
    }
    mi da questo errore all'ultima riga
    codice:
    error C2440: '=' : cannot convert from 'int (__stdcall *)(void)' to 'int (__cdecl *)(int,int)'
    come se ptr puntasse ad una funzione senza parametri.
    Aiutatemi per favore è da settimane che non riesco a trovare una soluzione.

    Se possibile il risultato che vorrei è quello di avere un file .exe ed uan cartella con le librerie. Preferirei non portarmi dietro file strani come ad esempio un .def od altri
    Grazie in anticipo. Cordiuali saluti. Ciaoo

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    E in queste settimane non hai pensato di cercare su MSDN? Un pò d'iniziativa che diamine.
    http://msdn.microsoft.com/it-it/library/64tkc9y5(VS.80).aspx
    Con tanto di esempio completo.

  3. #3
    ci avevo giòà dato una occhiata, però non mi aveva risolto il problema. ora guardo in modo più approfondito

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Se noti bene viene fatto un cast. Questo perchè la GetProcAddress restituisce un puntatore a funzione predefinito. Quindi per risolvere il tuo problema basta un semplice cast al tipo del tua funzione. (Personalmente ti consiglio un reinterpret_cast invece di un cast C-style, ma va bene pure quest'ultimo.)

  5. #5
    Originariamente inviato da shodan
    Se noti bene viene fatto un cast. Questo perchè la GetProcAddress restituisce un puntatore a funzione predefinito. Quindi per risolvere il tuo problema basta un semplice cast al tipo del tua funzione. (Personalmente ti consiglio un reinterpret_cast invece di un cast C-style, ma va bene pure quest'ultimo.)
    si, l'ho notato. Ora lo stò provando. per adesso grazie mille. se avrò ancora problemi continuerò a postare in questa discussione

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma ti serve proprio la LoadLibrary oppure puoi importare staticamente i rifierimenti alla DLL nel tuo exe (collegamento implicito)?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Rieccomi...

    preferisco fare un collegamento esplicito, altrimenti mi tocca portarmi dietro oltre all'exe ed alla dll altri file, o sbaglio?

    ho aggiornato il codice seguendo l'esempio di msdn
    codice:
    #include <iostream.h>
    #include <windows.h>
    typedef UINT (CALLBACK* LPFNDLLFUNC1)(INT,INT);
    void main()
    {
    HINSTANCE hDLL;               // Handle to DLL
    LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
    INT uReturnVal;
    
    hDLL = LoadLibrary("C:\\DLL\\Debug\\DLL.dll");
    cout<<"Handle = "<<hDLL<<"\n";
    if (hDLL != NULL)
    {
       lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
                                               "Somma");
       if (!lpfnDllFunc1)
       {
          // handle the error
    		FreeLibrary(hDLL);
    		MessageBox(0,"ERROR: Funzione non trovata","ERROR",MB_OK);
    		exit(0);
       }
       else
       {
          // call the function
          uReturnVal = lpfnDllFunc1(1, 2);
       }
    }
    else	MessageBox(0,"FATAL ERROR: DLL NON CARICATA","FATAL ERROR",MB_ICONSTOP); 
    
    }
    ma quando mi arriva ad eseguire la funzione mi da un errore.
    Eccoti una foto dell'errore

    Grazie ancora.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Sprunk
    Rieccomi...

    preferisco fare un collegamento esplicito, altrimenti mi tocca portarmi dietro oltre all'exe ed alla dll altri file, o sbaglio?
    Se parli della distribuzione, sbagli. Ti serve solo l'exe e la dll. E ti semplifichi la vita durante lo sviluppo.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    A ogni modo, il puntatore a funzione deve corrispondere esattamente altrimenti si corrompe lo stack.
    Originariamente inviato da Sprunk
    codice:
    #include <iostream.h>
    #include <windows.h>
    typedef INT (CALLBACK* LPFNDLLFUNC1)(INT,INT);
    void main()
    {
    HINSTANCE hDLL;               // Handle to DLL
    LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
    INT returnVal; // <ritorna un int giusto?
    ...
       else
       {
          INT a = 1;
          INT b = 1;
          // call the function
          uReturnVal = lpfnDllFunc1(a,b);
       }
    }

  10. #10
    ciò che mi interessa al momento è che, quando tutto sarà finito, per far funzionare il programma mi servano solo l'eseguigbile e la libreria dll. Con questi requisiti mi va bene qualsiasi metodo.
    se non sei riuscito a vedere la foto dell'errore, eccoti il link dioretto
    http://sprunk.altervista.org/Upload/ERROR.bmp

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.