Proper DLL class interfaces
I'm having problems getting a DLL interface to work on multiple compilers. The actual DLL is compiled in VC2003 and the client prog using it compiles and works fine in VC2003 also. However if compiled in another compiler (in this case DevCpp) it raises a seg fault exception when calling a class member.
How do you make proper class interfaces that works on multiple compilers?
Dll:
Code:
#include <windows.h>
class C
{
public:
virtual VOID Set(INT NewInt) = 0;
virtual INT Get() CONST = 0;
};
class CC : public C
{
public:
CC() { i = new INT(); }
~CC() { delete i; }
virtual VOID Set(INT NewInt) { (*i) = NewInt; }
virtual INT Get() CONST { return (*i); }
protected:
INT* i;
};
C* c = NULL;
extern "C" __declspec(dllexport) C* GetC()
{
return c;
}
BOOL WINAPI DllMain(HINSTANCE Dll, DWORD Reason, LPVOID Reserved)
{
switch(Reason)
{
case DLL_PROCESS_ATTACH:
{
c = new CC();
break;
}
case DLL_PROCESS_DETACH:
{
delete c;
break;
}
}
return TRUE;
}
Client:
Code:
#include <windows.h>
class C
{
public:
virtual VOID Set(INT NewInt) = 0;
virtual INT Get() CONST = 0;
};
typedef C* (*GET_C)();
INT WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, INT)
{
C* c;
GET_C GetC;
HINSTANCE Dll = LoadLibrary("..\\Release\\DllMultiCompilerTest.dll");
if(Dll == NULL)
{
MessageBox(NULL, "No dll!", "Message", MB_OK);
return 0;
}
GetC = reinterpret_cast<GET_C>(GetProcAddress(Dll, "GetC"));
if(GetC == NULL)
{
FreeLibrary(Dll);
MessageBox(NULL, "No func!", "Message", MB_OK);
return 0;
}
c = GetC();
if(c == NULL)
{
FreeLibrary(Dll);
MessageBox(NULL, "No object!", "Message", MB_OK);
return 0;
}
//*****************************************
//* This crashes DevCpp (but not VC++)
//*****************************************
c->Set(1337);
INT i = c->Get();
FreeLibrary(Dll);
MessageBox(NULL, "Success!", "Message", MB_OK);
return 0;
}