Chiamare funzioni in una DLL da C ++

Ho una soluzione in VS 2008 con 2 progetti in esso. Uno è una DLL scritta in C ++ e l’altra è una semplice applicazione console C ++ creata da un progetto vuoto. Mi piacerebbe sapere come chiamare le funzioni nella DLL dall’applicazione.

Supponiamo che sto iniziando con un progetto C ++ vuoto e che voglio chiamare una funzione chiamata int IsolatedFunction(int someParam)

Come lo chiamo?

Ci sono molti modi per farlo, ma penso che una delle opzioni più semplici sia quella di colbind l’applicazione alla DLL al momento del collegamento e quindi utilizzare un file di definizione per definire i simboli da esportare dalla DLL.

CAVEAT: l’approccio al file di definizione funziona meglio per i nomi di simboli non decorati . Se vuoi esportare simboli decorati allora è probabilmente meglio NON USARE l’approccio del file di definizione.

Ecco un semplice esempio su come è fatto.

Passaggio 1: definire la funzione nel file export.h .

 int WINAPI IsolatedFunction(const char *title, const char *test); 

Passaggio 2: definire la funzione nel file export.cpp .

 #include  int WINAPI IsolatedFunction(const char *title, const char *test) { MessageBox(0, title, test, MB_OK); return 1; } 

Passaggio 3: definire la funzione come esportazione nel file di definizione export.def .

 EXPORTS IsolatedFunction @1 

Passaggio 4: creare un progetto DLL e aggiungere i file export.cpp ed export.def a questo progetto. La creazione di questo progetto creerà un file export.dll e un file export.lib .

I seguenti due passaggi si collegano alla DLL al momento del collegamento. Se non si desidera definire i punti di ingresso al momento del collegamento, ignorare i due passaggi successivi e utilizzare LoadLibrary e GetProcAddress per caricare il punto di ingresso della funzione in fase di esecuzione.

Passaggio 5: Creare un progetto dell’applicazione di prova per utilizzare la DLL aggiungendo il file export.lib al progetto. Copiare il file export.dll nella stessa posizione dell’eseguibile della console di test .

Passaggio 6: chiamare la funzione IsolatedFunction dall’applicazione Test come mostrato di seguito.

 #include "stdafx.h" // get the function prototype of the imported function #include "../export/export.h" int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // call the imported function found in the dll int result = IsolatedFunction("hello", "world"); return 0; } 

Può anche esportare le funzioni da dll e importare da exe, è più difficile all’inizio, ma alla fine è molto più facile che chiamare LoadLibrary / GetProcAddress. Vedi MSDN .

Quando si crea il progetto con la procedura guidata VS, nella dll è presente una casella di controllo che consente di esportare le funzioni.

Quindi, nell’applicazione exe devi solo includere un’intestazione della dll con le definizioni appropriate e aggiungere il progetto dll come dipendenza all’applicazione exe.

Controlla questa altra domanda se vuoi approfondire questo punto Esportando le funzioni da una DLL con dllexport .

È ansible utilizzare la route LoadLibrary / GetProcAddress (come indicato da Harper nella sua risposta, di nuovo il collegamento al campione MSDN con collegamento dinamico in fase di esecuzione ) oppure è ansible colbind l’applicazione console al file .lib prodotto dal progetto DLL e includere il file .h file con la dichiarazione della tua funzione (come descritto nell’esempio MSDN di collegamento dinamico a caricamento )

In entrambi i casi, è necessario assicurarsi che la DLL esporti la funzione che si desidera chiamare correttamente. Il modo più semplice per farlo è utilizzare __declspec (dllexport) nella dichiarazione della funzione (come mostrato nella creazione di un campione MSDN della libreria a collegamento dinamico semplice ), sebbene sia ansible farlo anche tramite il file .def corrispondente nel progetto DLL.

Per ulteriori informazioni sull’argomento delle DLL, è necessario sfogliare l’argomento MSDN About Dynamic-Link Libraries .

I seguenti sono i 5 passaggi necessari:

  1. dichiara il puntatore della funzione
  2. Carica la libreria
  3. Ottieni l’indirizzo della procedura
  4. assegnalo al puntatore di funzione
  5. chiamare la funzione utilizzando il puntatore di funzione

Puoi trovare la schermata passo-passo VC ++ IDE su http://www.softwareandfinance.com/Visual_CPP/DLLDynamicBinding.html

Ecco lo snippet di codice:

 int main() { /*** __declspec(dllimport) bool GetWelcomeMessage(char *buf, int len); // used for static binding ***/ typedef bool (*GW)(char *buf, int len); HMODULE hModule = LoadLibrary(TEXT("TestServer.DLL")); GW GetWelcomeMessage = (GW) GetProcAddress(hModule, "GetWelcomeMessage"); char buf[128]; if(GetWelcomeMessage(buf, 128) == true) std::cout << buf; return 0; } 

Supponendo che tu stia parlando del caricamento dinamico di runtime delle DLL, stai cercando LoadLibrary e GetProAddress. C’è un esempio su MSDN .

Quando la DLL è stata creata, una lib di importazione viene di solito creata automaticamente e devi usare quella collegata al tuo programma insieme ai file di intestazione per chiamarla, ma in caso contrario puoi chiamare manualmente le funzioni di Windows come LoadLibrary e GetProcAddress per farlo funzionare.