For communication between DLL's and EXE's using C++ a commonly used technique is to have virtual interfaces to systems, as this way you can pass around a pointer to a structure which holds the pointers to the interface of each sub system. This is the technique we used in Runtime Compiled C++ and it's also how the CryENGINE passes around interfaces using gEnv.
For a look at what a system table looks like see this file.
Exporting classes without using virtual interfaces is not simple in general, for an overview have a look at this post on codeproject. Using a virtual interface makes things alot easier - they don't have to be pure virtual but this does help to eliminate mistakes. Make sure to define a virtual destructor to prevent the memory created in one module being freed in another.
Feel free to use any of the code in RCC++, we use a liberal Zlib license and you can just use which-ever parts you need.
I'm actually using the rtcc++ (win32 alternate file watcher api, remember?), and I'm now at the implementation stage. I skipped the actual example (simpleexample) code, because it was a bit huge (the consoleexample wasn't though)
I've actually read the codeproject article while googling, and I started to do something like that, but this seems a bit more organized.
So I guess I'll look into the SimpleExample now...