dot hat das wesendliche eigentlich schon angesprochen. Fakt ist das wenn du eine DLL mit LoadLibrary lädst und dann eine Klasse benutzen willst, die in der DLL Implementiert ist, müssen zwei Dinge erfüllt werden.
1) Du brauchst eine Funktion die den Einstieg in die DLL ermöglicht. Du kannst z.B. auch die d3d9.dll mit LoadLibrary laden. Dann lädst du mit GetProcAddress die Funktion Direct3DCreate9 und rufst diese dann auf. Die Funktion Direct3DCreate9 ist der Einstieg in die DLL und all ihrere Komponenten.
2) Alle Funktionen müssen virtuell sein. Das hat den Grund weil es keine feste Bindung zwischen der DLL und der EXE oder einer anderen DLL gibt. Virtuelle-Methoden haben die Eigenschaft das sie zur Laufzeit gelinkt werden und nicht durch den Linker der IDE.
Darum sprach dot auch das Interface Design an. Denn dieses erfüllt Punkt 2. Alle Methoden eines Interfaces sind virtuelle Methoden.
Die eigentliche Implementation des Interfaces kann jedoch auch ganz normale Methode beitzten (also nicht virtuell).
Wenn du ein PlugIn-System aufbauen willst, ist es notwendig das dieses PlugIn eine Funktion nach den C Spezifikationen besitzt. Die sind einfacher zu laden
C++ Funktionen können natürlich auch über GetProcAddress geladen werden, man must aber erst den qualifizierten Funktionsnamen aus der DLL lesen.
In meiner Engine hab ich es so gemacht. Jedes PlugIn stellt eine solche Funktion bereit. Dazu gibt es ein PlugIn-Interface dessen konkrete Implementation in der DLL implementiert wird. Die PlugIn-Funktion wird dann mittels GetProcAddress geladen und aufgerufen. Die Funktion erzeugt eine Instanz von dem PlugIn-Interface (dessen Implementierung) und liefert diese als Ergebnis. Das PlugIn-Interface stellt dann alle möglichen Methoden zur verfügung. Wie z.B. für das abfragen der Version.
Zu den Headern:
Die anderen Source Codes die deine Klasse (aus der DLL) benutzen wollen brauch natürlich die Header. Aber nur die wo das Interface definiert ist und nicht die Implementation des Interface.
Wenn du nur mit Pointern Arbeitest brauchst du diese Header nicht einmal in irgendeine andere Header einfügen. Das kannst du mit der Klassen Deklaration umgehen
Die Source-Datei brauch natürlich die Header.