Problem z użyciem klasy znajdującej się we własnej bibliotece dll.
Zacząłem bawić się w tworzenie dll-ek na podstawie: http://cpp0x.pl/#/kursy/?id=198
Z importowaniem zwykłych funkcji czy też zmiennych z tak utworzonej dll-ki - nie ma problemu wszystko działa. Natomiast problem jest z użyciem klas. Otóż zgodnie z podanym opisem zrobiłem sobie taki projekt biblioteki dll:
/////////////////////////////////////////////////////////////////////////////////
////////////////// biblioteka Projekt1.dll///////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
/////////////////kod źródłowy dll.h//////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
#ifndef _DLL_H_
#define _DLL_H_
#include <windows.h>
#include <iostream>
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else
# define DLLIMPORT __declspec (dllimport)
#endif
extern "C"
{
class DLLIMPORT DllClass
{
public:
DllClass( int );
virtual ~DllClass( void );
int wiek;
private:
};
}
extern "C"
{
DllClass * DLLIMPORT CreateObject( int );
void DLLIMPORT DestroyObject( DllClass * );
}
#endif
/////////////////////////////////////////////////////////////////////////////////
//////////////////////kod źródłowy dllmain.cpp /////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
#include "dll.h"
DllClass::DllClass( int p_wiek )
: wiek( p_wiek )
{
std::cout << "Wywolano konstruktor" << std::endl;
}
DllClass::~DllClass()
{
std::cout << "Wywolano destruktor" << std::endl;
}
DllClass * CreateObject( int a )
{
return new DllClass( a );
}
void DestroyObject( DllClass * wsk )
{
delete wsk;
}
BOOL APIENTRY DllMain( HINSTANCE hInst ,
DWORD reason ,
LPVOID reserved )
{
switch( reason )
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
///////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
Po kompilacji otrzymuję gotową bibliotekę Projekt1.dll
Teraz kod źródłowy programu wykorzystującego ją:
////////////////////////////////////////////////////////////////////////////
///////////////////// kod źródłowy main.cpp////////////////////////////////
///////////////////////////////////////////////////////////////////////////
#include <cstdlib>
#include <iostream>
#include <windows.h>
using namespace std;
class DllClass;
typedef DllClass *( * MYPROC )( int );
MYPROC wskaznik;
int main( int argc, char * argv[] )
{
HINSTANCE hDll;
hDll = LoadLibrary( "Projekt1.dll" );
if( hDll != NULL )
{
cout << "Poprawnie zaladowano biblioteke dll" << endl;
wskaznik =( MYPROC ) GetProcAddress( hDll, "CreateObject" );
if( wskaznik != NULL )
{
cout << "znaleziono poszukiwana funkcje CreateObject" << endl;
}
else
{
cout << " Nie znaleziono funkcji CreateObject w bibliotece dll" << endl;
}
}
else
{
cout << " Nie udalo sie zaladowac biblioteki dll" << endl;
}
DllClass * wsk = wskaznik( 44 );
cout << wsk->wiek;
FreeLibrary( hDll );
system( "PAUSE" );
return EXIT_SUCCESS;
}
//////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
Wszystko jest ok do linijki:
DllClass * wsk = wskaznik( 44 );
Konsola pokazuje że wywołał się konstruktor a zatem obiekt klasy DllClass został utworzony i mamy do niego dostęp przy pomocy wskaźnika: wsk
Jednak gdy próbuję odczytać publiczny składnik wiek z tego obiektu kompilator wskazuje błąd
Czy ktoś z Wielkich GURU na tym forum może pokazać gdzie robię błąd???