Ciao Berico,
nel seguente esempio creiamo una dll che contiene una classe chiamata CExportClassFromDll. La classe contiene una funzione membro "public" che ritorna il valore della variabile membro x (inizializzata nel costruttore):
Dichiarazione della classe nel file header ExportClassFromDll.h:
codice:
#ifdef EXPORTCLASSFROMDLL_EXPORTS
#define EXPORTCLASSFROMDLL_API __declspec(dllexport)
#else
#define EXPORTCLASSFROMDLL_API __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif
// This class is exported from the ExportClassFromDll.dll
class EXPORTCLASSFROMDLL_API CExportClassFromDll {
public:
CExportClassFromDll(void);
// TODO: add your methods here.
int GetValue();
private:
int x;
};
#ifdef __cplusplus
}
#endif
Definizione delle funzioni della classe nel file ExportClassFromDll.cpp:
codice:
#define EXPORTCLASSFROMDLL_EXPORTS
#include "ExportClassFromDll.h"
CExportClassFromDll::CExportClassFromDll()
{
x = 21;
return;
}
int CExportClassFromDll::GetValue()
{
return x;
}
Nel programma client, basta includere il file .lib (nell'esempio ExportClassFromDll.lib ) che il compilatore crea, fra le dipendenze del linker e includere il file ExportClassFromDll.h:
codice:
#include <iostream>
using namespace std;
#include "ExportClassFromDll.h"
int _tmain(int argc, _TCHAR* argv[])
{
CExportClassFromDll myCLassFromDll;
cout << myCLassFromDll.GetValue() << endl;
return 0;
}
Come puoi notare, nel file che definisce la classe nella dll, definiamo la macro EXPORTCLASSFROMDLL_EXPORTS in modo che, compilando la dll, la macro EXPORTCLASSFROMDLL_API si espanda in __declspec(dllexport).
Nel client invece, includendo semplicemente il file ExportClassFromDll.h senza definire la macro EXPORTCLASSFROMDLL_EXPORTS, la macro EXPORTCLASSFROMDLL_API[/b] si espande in __declspec(dllimport).
la direttiva extern "C" consente di esportare/importare i nomi senza che vengano decorati dal compilatore CPP. Questo rende la nostra DLL utilizzabile da diversi compilatori (ogni compilatore CPP utilizza infatti una tecnica diversa per decorare i nomi esportati da una dll).
È la tecnica utilizzata dalla Microsoft per esportare/importare le funzioni della API Win32; basta dare un'occhiata agli header file del SDK.