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.