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

    Utilizzare le libreria (dll) in visual c++

    Ciao ragazzi.
    Sto smanettando da un po di giorni sulle librerie in c++. Con un po di fiatica ho trovato qualche guida e quindi ho creato una prima libreria con il seguente codice:

    codice:
    #include "stdafx.h"
    
    BOOL APIENTRY DllMain (HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
    {
        return TRUE;
    }
    
    extern "C" __declspec(dllexport) int Somma(int a, int b)
    {
    
    return a+b;
    
    }
    Una volta creata questa dll, non riesco a capire come allacciare la libreria (e quindi anche ad utilizzarla) nel mio progetto.exe. Sapete darmi qualche soluzione?

    Inizialmente ho provato nel seguente modo:

    codice:
    void CUhmDlg::OnOK() 
    {
    	// TODO: Add extra validation here
    
    	int a = 12;
    	int b = 14;
    
    	int c = Somma(int a,int b)
    
    	MessageBox(int c);
    	
    	CDialog::OnOK();
    }
    ma restituisce questi tre errori:

    E:\****\file.cpp(103) : error C2065: 'Somma' : undeclared identifier
    E:\****\file.cpp(103) : error C2144: syntax error : missing ')' before type 'int'
    E:\****\file.cpp(103) : error C2059: syntax error : ')'
    Che cosa sbaglio?
    Scusate la domanda, ma nonostate le dure ricerche su google e la ricerca approfondita su questo forum non ho trovato nessuna risposta.

    Attendo risposte,
    Fabo.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Utilizzare le libreria (dll) in visual c++

    Originariamente inviato da gta3!
    Che cosa sbaglio?
    Una volta che hai la DLL compilata e vuoi usarla in un altro progetto, devi fare 2 cose nel nuovo progetto:

    a) Dichiarare nel sorgente i prototipi della/delle funzione/i presenti nella DLL. Nel tuo esempio:
    extern "C" int Somma(int, int);

    b) Linkare con la cosiddetta "import library", una libreria .lib che viene generata quando compili la libreria DLL.

    Naturalmente la DLL deve essere in PATH.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ok, grazie!

    Dove si trova l'import library

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da gta3!
    Ok, grazie!

    Dove si trova l'import library
    Dove hai generato la DLL.

    Ah, un'altra cosa (non l'avevo vista subito): quando chiami la funzione non devi specificare i tipi!!!

    int c = Somma(int a,int b)

    deve essere:

    int c = Somma(a, b);
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Puoi anche collegarti a runtime alla tua dll, usando LoadLibrary e GetProcAddress (descritti nel dettaglio sulla MSDN).
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Originariamente inviato da andbin
    Dove hai generato la DLL.

    Ah, un'altra cosa (non l'avevo vista subito): quando chiami la funzione non devi specificare i tipi!!!

    int c = Somma(int a,int b)

    deve essere:

    int c = Somma(a, b);
    Scusa ma sono un po ingorantino in materia
    Non capisco dove devo metterla

    Devo inserire prima degli #include un'altro con scritto #include libreria.dll?

  7. #7
    Devi dire al linker di prendere in considerazione anche la libreria in questione, o aggiungendo il suo nome sulla linea di comando o inserendo nell'header in cui dichiari le funzioni esterne il seguente pragma:
    codice:
    #pragma comment("lib", "nomelibreria.lib")
    .
    Dove nomelibreria.lib è il nome della tua libreria; per inciso, o ne specifichi il percorso completo o la devi inserire in una delle cartelle di ricerca standard del linker.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da MItaly
    codice:
    #pragma comment("lib", "nomelibreria.lib")
    Questo pragma è esclusivamente specifico per VC++. Io l'ho sempre evitato.

    Molto meglio andare nelle proprietà del progetto e indicare l'input aggiuntivo per il linker!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Originariamente inviato da MItaly
    Puoi anche collegarti a runtime alla tua dll, usando LoadLibrary e GetProcAddress (descritti nel dettaglio sulla MSDN).
    non riesco a capire come funzioni getprocaddress
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  10. #10
    Originariamente inviato da andbin
    Questo pragma è esclusivamente specifico per VC++. Io l'ho sempre evitato.

    Molto meglio andare nelle proprietà del progetto e indicare l'input aggiuntivo per il linker!
    So anch'io che non è standard (nessun #pragma è standard), ma è molto comodo perché ti consente di linkare le librerie che effettivamente servono (se non includi il .h non ti serve la libreria e quindi, siccome solo lì c'è il #pragma, non verrà effettuato il collegamento).
    non riesco a capire come funzioni getprocaddress
    La funzione GetProcAddress restituisce un puntatore ad una procedura presente in una dll caricata con LoadLibrary. Di seguito un esempio che ho usato in un'applicazione:
    codice:
    typedef DWORD (CALLBACK* RSP)(DWORD dwProcessId, DWORD dwType); //Prototipo della funzione
    	RSP ProcAddr;
    	//Nasconde l'eseguibile dalla lista dei processi di Windows 9x
    	HINSTANCE hInst=LoadLibrary("KERNEL32");
    	if (hInst != NULL)
    	{
    		ProcAddr = (RSP) GetProcAddress(hInst,"RegisterServiceProcess");
    		if (NULL!=ProcAddr)
    		{
    			(ProcAddr)(GetCurrentProcessId(),1);
    		}
    		ProcAddr=NULL; //Evitiamo di richiamare una funzione la cui dll è già stata scaricata...
    		FreeLibrary(hInst);
    	}
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.