2013-07-29 8 views
8

http://msdn.microsoft.com/en-us/library/9h658af8.aspx__declspec (dllimport) come caricare biblioteca

MSDN dice che posso esportare funzione dalla biblioteca __declspec(dllexport) ma come posso caricare questa libreria nel mio eseguibile?

Ho una funzione esportata nella DLL:

__declspec(dllexport) void myfunc(){} 

E ora vorrei usarlo nella mia eseguibile:

__declspec(dllimport) void myfunc(void); 

Ma come il mio programma saprà dove trovare questo funzione?

+4

Dai un'occhiata alla: http://stackoverflow.com/questions/538134/exporting-functions-from-a-dll-with-dllexport –

+3

Non spetta al vostro programma. Spetta al sistema operativo trovare la DLL di cui hai bisogno. Puoi dargli un tempo molto difficile per farlo, ma non ha proprio senso farlo. Assicurati che la DLL sia presente nella stessa directory del tuo EXE e funzionerà bene. –

risposta

7

Questo è il lavoro del compilatore/linker, è fatta automaticamente fino a quando si

  1. includere il Lib nelle opzioni di linker
  2. forniscono la DLL in fase di esecuzione in modo che sia trovato dal exe

Il file .lib viene generato quando si compila la DLL o viene fornito con esso se non è il codice. In questo caso il codice è compilato con __declspec(dllexport).

Durante la compilazione del file exe, il compilatore vede che la funzione inclusa si trova nella DLL. In questo caso il codice è compilato con __declspec(dllimpport).

Il linker viene fornito con il file .lib e genera istruzioni appropriate nel file exe.

Queste istruzioni consentiranno a Exe di trovare la DLL e caricare la funzione esportata in fase di esecuzione. La DLL deve semplicemente essere accanto all'Exe (ci sono comunque altri posti possibili).

Il passaggio da __declspec(dllimpport) a __declspec(dllexport) viene eseguito da una macro, provided by Visual C++ when creating a DLL project.

+0

Come posso fornire la DLL in fase di runtime? – deepspace

+0

@deeppace vedere la mia modifica, deve solo essere accanto alla Exe – CharlesB

1

Il sistema operativo sarà in grado di individuarlo in base al processo di collegamento. Se la tua libreria è collegata correttamente al tuo programma, riconoscerà che è in uso una funzione esterna e la cercherà nei percorsi della DLL. Se non riesce a trovarlo, il linker genererà un errore.

Si consiglia di eseguire alcune letture nel processo di collegamento; a volte può essere fonte di confusione, ma capirlo può aiutarti a cogliere alcuni concetti chiave in C/C++.

1

Se si utilizza una DLL, è possibile utilizzare la combinazione LoadLibrary e GetProcAddress.

//Load the DLL 
HMODULE lib = LoadLibrary("testing.dll"); 

//Create the function 
typedef void (*FNPTR)(); 
FNPTR myfunc = (FNPTR)GetProcAddress(lib, "myfunc"); 

//EDIT: For additional safety, check to see if it loaded 
if (!myfunc) { 
    //ERROR. Handle it. 
} 

//Call it! 
myfunc(); 
+0

è una alternativa a __declspec (dllimpport)? – pasha

Problemi correlati