Many years ago I did some work on a PC game that actually made it to the shelves. I worked on a Rugby Match simulator. I did the DLL in Delphi and the rest of the project team worked in C++.

I went back and had a look at my code. I used Classes internal to my DLL but only exported procedures and functions.

My Type declarations were somethign like:
[pascal]
Type
TPlayer = Class
Name : Stirng;
Skill : Integer;
End;
[/pascal]

My functions that got exported were
[pascal]
Procedure FindPlayer(Name : String);
Function PlayerSkill(Name : Stirng):Integer;
Procedure FirstPlayer;
Procedure NextPlayer;
[/pascal]

Then the guys could call PlayerSkill('Ultra') and get his skill.

So my DLL managed all the Class stuff and memory issues that went with that and the exports were static to find a single item of information (sort of like TSearchRec does it).