#include #include #include "TestInterface.h" // I have put the logOneLine as a global to this file for clarity's sake, and simplified it. void logOneLine (const char *caller, const char *msg) { static FILE *log = 0; log = fopen("TestDLL.log", log ? "at" : "wt"); fprintf (log, "%s: %s\n", caller, msg); fclose (log); } // Macro logging to ease reading the code. #define Log(x) logOneLine(__func__, (x)); // I added a constructor to TestInterface, visible in the log. TestInterface::TestInterface () { Log ("..."); } TestInterface::~TestInterface() { Log ("..."); } // You have to tell the compiler that you are exporting this class too (see the DECLSPEC definition in the header). class DECLSPEC Test : public TestInterface { public: /**/ Test (const bool, const int); virtual ~Test (); virtual bool get (bool &flag, int &num); virtual bool set (const bool flag, const int num); private: bool f_flag; int f_num; }; // You don't need to re-specify the calling convention nor the declspec here, as it is implicitelly done in the above. Test::Test (const bool flag, const int num) // Also, attention, you have to initialize your parent class and your members, in that order: : TestInterface(), f_flag(flag), f_num(num) { Log ("..."); char buff [255]; sprintf (buff, "flag=%s, num=%d", flag ? "true" : "false", num); Log (buff); } Test::~Test () { Log ("..."); } // Accessors. bool Test::get (bool &flag, int &num) { flag = f_flag; num = f_num; return true; } bool Test::set (const bool flag, const int num) { f_flag = flag; f_num = num; return true; } // Factory stuff. TestInterface* Instanciate (const bool flag, const int num) { Log ("..."); return new Test(flag, num); } void Destroy (TestInterface *f) { Log ("..."); delete f; }