Witam.
Nagłówek biblioteki DLL:
#ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
#include <Windows.h>
#include <iostream>
using namespace std;
class Test
{
public:
int val;
public:
Test();
virtual int non();
virtual int get();
};
#endif /* _DLL_H_ */
Definicja klasy
#include "DLLClass.h"
Test::Test()
{
val = 99;
}
int Test::non()
{
return 555;
}
int Test::get()
{
return val;
}
extern "C" __declspec(dllexport) Test * CreateObjectOfClass()
{
return new Test();
}
BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason ,LPVOID reserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH:
cout << "Load DLL" << endl;
break;
case DLL_PROCESS_DETACH:
cout << "Unload DLL" << endl;
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
Wykorzystanie biblioteki:
#include <windows.h>
#include <iostream>
#include <string>
#include "DLLClass.h"
using namespace std;
int main()
{
HMODULE hMod;
hMod = LoadLibrary("E:\\DLLClass\\Release\\DLLClass.dll");
if(hMod != NULL)
{
typedef Test* (*PFNCreateTest)();
PFNCreateTest pfnCreateTest = (PFNCreateTest)GetProcAddress(hMod, "CreateObjectOfClass");
if(pfnCreateTest != NULL)
{
Test * a = (pfnCreateTest)();
cout << a->get() << endl;
delete a;
a = NULL;
}
FreeLibrary(hMod);
}
return 0;
}
Problem polega na tym, iż każda metoda klasy, która chce wykonywać jakieś operacje na jej składnikach ( w tym wypadku na zmiennej val ), powoduje naruszenie segmentu pamięci. Metoda get zwraca jedynie wartość zmiennej publicznej val. Wygląda na to, że sposób deklaracji metod klasy powoduje, iż nie widzą się one na wzajem. Dzieje się to samo, gdy z funkcji get chciałbym wywołać metodę non.
Obiekt klasy jest tworzony. Potrafię wywołać funkcję non bez błędnie, ale ona nie działa na zmiennej val.
Mogę również bezpośrednio odwołać się do publicznej zmiennej val:
Test * a = (pfnCreateTest)();
cout << a->val << endl;
Ciekawostką jest jedna rzecz. Otóż modyfikując nieco funkcję get wszystko działa w porządku. Oto kod:
// deklaracja w klasie
virtual int get(Test * ptr);
// definicja
int Test::get(Test * ptr)
{
return ptr->val;
}
// użycie
Test * a = (pfnCreateTest)();
cout << a->get(a) << endl;
, wtedy wszystko działa w porządku.
Będę wdzięczny za wskazówki.
Pozdrawiam