Tworzenie rozszerzeń programów

dział ogólny

Re: Klasy w dll

Nowy postprzez wargo » sobota, 3 października 2009, 11:31

No z tym sobie poradziłem ale mam problemy z podłączeniem tego. Ale czy naprawdę nie możesz dać jakiegoś przykładu co by plik dll np. zmieniał zawartość Edit1 (aplikacja+dll)?
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez polymorphism » sobota, 3 października 2009, 11:54

Nie mogę, bo od wielu lat nie piszę w BCB. To po pierwsze. Po drugie, to co podałem powinno ci wystarczyć. A jeśli masz z tym problem, znaczy że brak ci podstaw programowania obiektowego w C++. Niestety, ale tak to wygląda.

Co do zmiany wartości Edit, pisałem, że wtyczka powinna realizować tego typu rzeczy poprzez interfejs IHost, po to on jest.
Kod: Zaznacz cały
// wtyczka wywołuje
m_host->SetEditLabel("jakiś tekst");

...

//host implementuje
void CHostImpl::SetEditLabel(const char *label)
{
    m_edit1->Text = label;
}
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez wargo » sobota, 3 października 2009, 12:00

Chcę wiedzieć jak połączyć wszystko z programem
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez polymorphism » sobota, 3 października 2009, 12:07

Przecież pisałem jak! Ładujesz bibliotekę funkcją LoadLibrary, pobierasz adres funkcji createInstance funkcją GetProcAddress i wywołujesz ją w celu stworzenia obiektu IPlugin.

I nie zadawaj mi takich lakonicznych pytań, bo nie wiadomo o co pytasz. Konkrety!
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez wargo » sobota, 3 października 2009, 13:18

polymorphism napisał(a):
Kod: Zaznacz cały
//host implementuje
void CHostImpl::SetEditLabel(const char *label)
{
    m_edit1->Text = label;
}

Ale mam to wstawić w plik źródłowy programu?
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez polymorphism » sobota, 3 października 2009, 13:29

A jak myślisz? Przecież pisałem, że IHost'a musi zaimplementować aplikacja, nie wtyczka.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez wargo » sobota, 3 października 2009, 13:44

Ale jak to zrobić? Gdzie wstawić podany wyżej kod i co trzeba jeszcze zrobić? Wtyczka jest już skompilowana!
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez polymorphism » sobota, 3 października 2009, 14:49

Kod: Zaznacz cały
typedef (*acreateInstance)();

Co to jest? Czyżby miał to być wskaźnik na tę:
Kod: Zaznacz cały
IPlugin* __declspec(dllexport) createInstance(IHost *host);

funkcję???

PS. w zasadzie powinno tam być jeszcze extern "C", przeoczyłem :?

Kod: Zaznacz cały
class IPlugin
{
public:
   __fastcall CPluginImpl(); //<--- to to tu robi u diabła?!?!?!
   ...
};

Dałeś w unit1.cpp implementację metody CHostImpl::SetEditLabel, ale gdzie jest definicja klasy CHostImpl, która dziedziczy po IHost???

Pisałem też, żebyś się dowiedział jak się robi poprawnie pliki nagłówkowe. Oczywiście nie zobaczyłeś i nie poprawiłeś.

Kod: Zaznacz cały
GetProcAddress(DLLHandle, "_createInstance");

Głupotą by było, gdyby funkcje wtyczek miały ten podkreślnik. W opcjach projektu możesz to wyłączyć. Nie wiem dokładnie gdzie, ale wiem, że na pewno jest taka możliwość. Poszukaj.



Tak sobie myślę, wargo, że zanim zaczniesz pisać system wtyczek, powinieneś wziąć jakąś dobrą książkę od C++ i przerobić z nią na spokojnie obszerny dział o klasach. Inaczej nic z tego nie będzie. Ja tobie podsuwam pewne koncepcje (nie rozwiązania!), a ty w ogóle nie wiesz o czym ja pisze, bo brak ci podstaw, które normalnie byłyby płaszczyzną porozumienia. Jednym słowem, lipa :?
____
PS. tak na dobrą sprawę wszystkie funkcje i metody obu interfejsów powinny mieć jawnie określoną konwencję wywołania, najlepiej __stdcall.
Ostatnio edytowano niedziela, 4 października 2009, 12:44 przez polymorphism, łącznie edytowano 1 raz
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez wargo » sobota, 3 października 2009, 14:58

polymorphism napisał(a):
Kod: Zaznacz cały
typedef (*acreateInstance)();

Co to jest? Czyżby miał to być wskaźnik na tę:
Kod: Zaznacz cały
IPlugin* __declspec(dllexport) createInstance(IHost *host);

funkcję???

A nie ma być?


polymorphism napisał(a):PS. w zasadzie powinno tam być jeszcze extern "C", przeoczyłem :?

Nie, bo to ma być dynamicznie! Działa bez tego


polymorphism napisał(a):
Kod: Zaznacz cały
class IPlugin
{
public:
   __fastcall CPluginImpl(); //<--- to to tu robi u diabła?!?!?!
   ...
};


Konstruktor :D
Czyli mam to usunąć?


polymorphism napisał(a):
Kod: Zaznacz cały
GetProcAddress(DLLHandle, "_createInstance");

Głupotą by było, gdyby funkcje wtyczek miały ten podkreślnik. W opcjach projektu możesz to wyłączyć. Nie wiem dokładnie gdzie, ale wiem, że na pewno jest taka możliwość. Poszukaj.

Czyli nie muszę tego znaku wpisywać (oczywiście po ustawieniu)? Bo teraz to chyba nie ma znaczenia że jest - funkcja się nazywa createInstance to w GetProcAddress muszę dodać znak.



polymorphism napisał(a):Dałeś w unit1.cpp implementację metody CHostImpl::SetEditLabel, ale gdzie jest deklaracja klasy CHostImpl, która dziedziczy po IHost???

No właśnie do tego zmierzam!
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez polymorphism » sobota, 3 października 2009, 15:12

A nie ma być?

Odsyłam do książek...

Nie, bo to ma być dynamicznie!

A co ma piernik do wiatraka?

Konstruktor :D

Tak się robi konstruktory?

No właśnie do tego zmierzam!

Wiem. Przeczytaj jeszcze raz końcówkę mojego poprzedniego posta.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez wargo » sobota, 3 października 2009, 15:26

Żart:
polymorphism napisał(a):
Nie, bo to ma być dynamicznie!

A co ma piernik do wiatraka?

A to że młyny go zmieliły



polymorphism napisał(a):
A nie ma być?
Odsyłam do książek...

Powiedz co sądzisz o tym sposobie. Pytam czy mam wywołać właśnie tą funkcję (createInstance) aby reszta działała-sam przecież pisałeś!


polymorphism napisał(a):Dałeś w unit1.cpp implementację metody CHostImpl::SetEditLabel, ale gdzie jest deklaracja klasy CHostImpl, która dziedziczy po IHost???

Ta funkcja ma być wywoływana z poziomu dll, gdyby to wszystko było w 1 programie to może bym sobie poradził. No ale jak wywoływać funkcje z klas umieszczonych w dll(i wszystko od nowa :/)?
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez polymorphism » sobota, 3 października 2009, 16:00

Powiedz co sądzisz o tym sposobie.

A co ja mam sądzić? Źle zrobiłeś wskaźnik i tyle.

gdyby to wszystko było w 1 programie to może bym sobie poradził.

Nie poradziłbyś sobie, bo to akurat nijak ma się do tego, że coś tam masz w DLL-ce. Mowa o IHost, który ma być w pełni zaimplementowany po stronie aplikacji, więc to wielkie halo sprowadza się do stworzenia klasy, jak każdej innej, z tą różnicą, że dziedziczącej po IHost.

No ale jak wywoływać funkcje z klas umieszczonych w dll

Wiele postów wcześniej dostałeś odpowiedź w przykładzie. No ale trzeba się nad tym trochę zastanowić, przemyśleć sprawę, zrozumieć.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez wargo » sobota, 3 października 2009, 16:07

polymorphism napisał(a):Mowa o IHost, który ma być w pełni zaimplementowany po stronie aplikacji, więc to wielkie halo sprowadza się do stworzenia klasy, jak każdej innej, z tą różnicą, że dziedziczącej po IHost.

Czyli mam to samo co w dll wkleić do aplikacji?
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez polymorphism » sobota, 3 października 2009, 16:25

Dobra, masz tu kod bardziej łopatologiczny. Jeśli tego nie zrozumiesz, odpuść sobie...

Plik plugin.h (niekompletny):
Kod: Zaznacz cały
...
#ifdef PLUGIN
#   define DLL_EXPORT __declspec(dllexport)
#else
#   define DLL_EXPORT __declspec(dllimport)
#endif

class IHost
{
public:
   virtual void __stdcall TextOut(const char*) = 0;
};

class IPlugin
{
public:
   virtual const char* __stdcall getName() = 0;
   virtual void __stdcall Destroy() = 0;
};

IPlugin* DLL_EXPORT __stdcall createInstance(IHost*);

PLUGIN musi być zdefiniowane podczas pisania wtyczki.

Implementacja plugina w DLL:
Kod: Zaznacz cały
#include "plugin.h"
...
class CPluginImpl:public IPlugin
{
   IHost*   m_host;
public:
   CPluginImpl(IHost *host):m_host(host)
   {
      m_host->TextOut("wywolanie konstruktora CPluginImpl\n");
   }
   
   virtual ~CPluginImpl() { }

   const char* __stdcall getName()
   {
      return "wywolanie CPluginImpl::getName\n";
   }
   
   void __stdcall Destroy() { delete this; }
};

IPlugin* __stdcall createInstance(IHost *host)
{
   return new(std::nothrow) CPluginImpl(host);
}

Implementacja hosta w aplikacji:
Kod: Zaznacz cały
#include "plugin.h"
...

class CHostImpl:public IHost
{
   ostream&   m_os;
public:
   void __stdcall TextOut(const char *text)
   {
      m_os << text;
   }
   
   CHostImpl(ostream &os):m_os(os) {}
   virtual ~CHostImpl() { }
}

// w main
...
CHostImpl host(cout);
...
IPlugin *plugin = createInstance_ptr(&host);

cout << plugin->getName();

plugin->Destroy();

...

createInstance_ptr jest wskaźnikiem z poprawnie przypisaną wartością zwróconą przez GetProcAddress.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez wargo » sobota, 17 października 2009, 19:49

[C++ Error] ccc.cpp(8): E2303 Type name expected

Kod: Zaznacz cały
ostream&   m_os;

Dodałem potem to i to samo:
Kod: Zaznacz cały
#include <ostream>
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Poprzednia stronaNastępna strona

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 4 gości

cron