Klasa w bibliotece dll

dział ogólny

Klasa w bibliotece dll

Nowy postprzez rafalskraba » poniedziałek, 1 lutego 2010, 21:53

Witam
Mam utworzoną taką klasę którą umieściłem w bibliotece dll

Kod: Zaznacz cały
//---------------------------------------------------------------------------

#include <vcl.h>
#include <Classes.hpp>
#include <windows.h>
#pragma hdrstop
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#pragma argsused
#define PI 3.14159265358979323846
class __declspec(dllexport) Tbryly;
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
   return 1;
}
//---------------------------------------------------------------------------
class Tbryly
{
   private:
      int bok_a;
      int bok_b;
      int wysokosc_h;
      int promien_r;
   public:
      Tbryly();
      ~Tbryly();
      float pole_kwadratu(int,int);
      float pole_trojkata(int,int);
      float objetosc_szescianu(int,int,int);
      float objetosc__kuli(int);
};
Tbryly::Tbryly()
{
   bok_a=2;
   bok_b=3;
   wysokosc_h=5;
   promien_r=7;
}
Tbryly::~Tbryly()
{

}
float Tbryly::pole_kwadratu(int a, int b)
{
   float pole_kw;
   pole_kw=a*b;
   return pole_kw;
}

float Tbryly::pole_trojkata(int a, int h)
{
   float pole_tr;
   pole_tr=1/3*a*h;
   return pole_tr;
}
float Tbryly::objetosc_szescianu(int a, int b, int h)
{
   float objetosc_sz;
   objetosc_sz=a*b*h;
   return objetosc_sz;
}
float Tbryly::objetosc__kuli(int r)
{
   float objetosc_k;
   objetosc_k=4/3*PI*r;
   return objetosc_k;
}


Biblioteke dołanczam statycznie do projektu aplikacji poprzez dołaczenie pliku *.lib do projektu.

Nie mogę jednak uzyskać dostępu do klasy zawartej w tej bibliotece.
"Jednym z rodzajów szczęśliwości jest zdolność podejmowania dobrych decyzji."

- Platon-
Avatar użytkownika
rafalskraba
Intelektryk
Intelektryk
 
Posty: 122
Dołączył(a): czwartek, 5 marca 2009, 10:20
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: RAD Studio XE2 Update 4 HotFix 1
SKYPE: rafal.skraba
Gadu Gadu: 0
    Windows 7Firefox

Re: Klasa w bibliotece dll

Nowy postprzez banita » poniedziałek, 1 lutego 2010, 22:10

podobny temat byl juz przerabiany.
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    Windows XPOpera

Re: Klasa w bibliotece dll

Nowy postprzez polymorphism » poniedziałek, 1 lutego 2010, 22:11

Biblioteke dołanczam statycznie do projektu aplikacji poprzez dołaczenie pliku *.lib do projektu.

A plik nagłówkowy z definicją klasy?

Skąd kompilator ma wiedzieć, że metody klasy Tbryly mają być wyeksportowane?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2271
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 211
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Klasa w bibliotece dll

Nowy postprzez rafalskraba » poniedziałek, 1 lutego 2010, 22:25

Definicja klasy oraz jej poszczególne metody są zawarte w jednym pliku. Definicja klasy:
Kod: Zaznacz cały
class Tbryly
{
   private:
      int bok_a;
      int bok_b;
      int wysokosc_h;
      int promien_r;
   public:
      Tbryly();
      ~Tbryly();
      float pole_kwadratu(int,int);
      float pole_trojkata(int,int);
      float objetosc_szescianu(int,int,int);
      float objetosc__kuli(int);
};


A o tym czy klasa ma być wyeksportowana mówi nam ten zapis:
Kod: Zaznacz cały
class __declspec(dllexport) Tbryly;
"Jednym z rodzajów szczęśliwości jest zdolność podejmowania dobrych decyzji."

- Platon-
Avatar użytkownika
rafalskraba
Intelektryk
Intelektryk
 
Posty: 122
Dołączył(a): czwartek, 5 marca 2009, 10:20
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: RAD Studio XE2 Update 4 HotFix 1
SKYPE: rafal.skraba
Gadu Gadu: 0
    Windows 7Firefox

Re: Klasa w bibliotece dll

Nowy postprzez polymorphism » poniedziałek, 1 lutego 2010, 23:47

Definicja klasy oraz jej poszczególne metody są zawarte w jednym pliku

Dodajmy, że w pliku CPP biblioteki. Ja się pytam, skąd o klasie ma wiedzieć aplikacja, do której chcesz podłączyć DLL-kę? Sam LIB nie wystarczy, od razu mówię.

A o tym czy klasa ma być wyeksportowana mówi nam ten zapis:

Fakt, przeoczyłem. Chociaż nie wiem, dlaczego dałeś __declspec(dllexport) w deklaracji klasy, a nie przy definicji. Takie sztuczki nie zwiększają czytelności kodu.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2271
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 211
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Klasa w bibliotece dll

Nowy postprzez rafalskraba » wtorek, 2 lutego 2010, 00:12

Dokładnie jest to plik *.cpp biblioteki.
Dla porządku można również zapisać tak:

Kod: Zaznacz cały
class __declspec(dllexport) Tbryly
{
   private:
      int bok_a;
      int bok_b;
      int wysokosc_h;
      int promien_r;
   public:
      Tbryly();
      ~Tbryly();
      float pole_kwadratu(int,int);
      float pole_trojkata(int,int);
      float objetosc_szescianu(int,int,int);
      float objetosc__kuli(int);
};


W programie który ma wykorzystywać w/w klasę wraz z jej metodami najpierw import

Kod: Zaznacz cały
class __declspec(dllimport) Tbryly;


Natomiast wywołanie klasy zapisałem w ten sposób:

Kod: Zaznacz cały
int A,B;
   A=StrToInt(Edit1->Text);
   B=StrToInt(Edit2->Text);
    Tbryly klasa1;


Kompilator wywalił błędy:
Kod: Zaznacz cały
Undefined structure 'Tbryly'
Size of 'klasa1' is unknown or zero
"Jednym z rodzajów szczęśliwości jest zdolność podejmowania dobrych decyzji."

- Platon-
Avatar użytkownika
rafalskraba
Intelektryk
Intelektryk
 
Posty: 122
Dołączył(a): czwartek, 5 marca 2009, 10:20
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: RAD Studio XE2 Update 4 HotFix 1
SKYPE: rafal.skraba
Gadu Gadu: 0
    Windows 7Firefox

Re: Klasa w bibliotece dll

Nowy postprzez polymorphism » wtorek, 2 lutego 2010, 12:46

Kompilator wywalił błędy:

Wywalił Ci błędy, bo nie wie, czym jest klasa Tbryly, nigdzie nie ma jej definicji (dałeś deklarację, ale to za mało). DLL-ka nie eksportuje definicji klas/struktur, jedynie metody, funkcje i zmienne, czyli coś, co istnieje w pamięci. Dlatego pytałem się o nagłówek z definicją klasy. Czyli ta definicja:
Kod: Zaznacz cały
class __declspec(dllimport/dllexport) Tbryly
{
   private:
      int bok_a;
      int bok_b;
      int wysokosc_h;
      int promien_r;
   public:
      Tbryly();
      ~Tbryly();
      float pole_kwadratu(int,int);
      float pole_trojkata(int,int);
      float objetosc_szescianu(int,int,int);
      float objetosc__kuli(int);
};

musi być w obu projektach - aplikacji i biblioteki.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2271
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 211
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Klasa w bibliotece dll

Nowy postprzez rafalskraba » środa, 3 lutego 2010, 00:08

Problem rozwiązałem w następujący sposób:
kod biblioteki DLL:
1. plik "bryly.h"
Kod: Zaznacz cały
class __declspec(dllexport) Tbryly
{
   private:
      int bok_a;
      int bok_b;
      int wysokosc_h;
      int promien_r;
   public:
      Tbryly();
      ~Tbryly();
      double pole_kwadratu(int,int);
      double pole_trojkata(int,int);
      double objetosc_szescianu(int,int,int);
      double objetosc__kuli(int);
};


2. Plik "bryly.cpp"
Kod: Zaznacz cały
//---------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>
#include "bryly.h"
#pragma hdrstop
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------

#pragma argsused
#define PI 3.14159265358979323846
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
   return 1;
}
//---------------------------------------------------------------------------
Tbryly::Tbryly()
{
   bok_a=2;
   bok_b=3;
   wysokosc_h=5;
   promien_r=7;
}
Tbryly::~Tbryly()
{

}
double Tbryly::pole_kwadratu(int a, int b)
{
   float pole_kw;
   pole_kw=a*b;
   return pole_kw;
}

double Tbryly::pole_trojkata(int a, int h)
{
   float pole_tr;
   pole_tr=0.3333333*a*h;
   return pole_tr;
}
double Tbryly::objetosc_szescianu(int a, int b, int h)
{
   float objetosc_sz;
   objetosc_sz=a*b*h;
   return objetosc_sz;
}
double Tbryly::objetosc__kuli(int r)
{
   float objetosc_k;
   objetosc_k=1.3333333*PI*r*r*r;
   return objetosc_k;
}


Plik cpp aplikacji:
Kod: Zaznacz cały
#include "bryly.h" // plik z definicją klasy
.
.
.
__declspec(dllimport) Tbryly; // import metod klasy
.
.
.


Teraz wszystko działa poprawnie.
Wielkie dzięki kolego polymorphism za cenne wskazówki.
"Jednym z rodzajów szczęśliwości jest zdolność podejmowania dobrych decyzji."

- Platon-
Avatar użytkownika
rafalskraba
Intelektryk
Intelektryk
 
Posty: 122
Dołączył(a): czwartek, 5 marca 2009, 10:20
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: RAD Studio XE2 Update 4 HotFix 1
SKYPE: rafal.skraba
Gadu Gadu: 0
    Windows 7Firefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron