I have had some success using a fairly naive system:
- Create API Specification for plug-ins
- Use a singleton plug-in manager
- Use LoadLibrary/GetProcAddress based run time dynamic linking
- Implement Inversion of control based event handling for notifying the plug-ins