Tworzenie rozszerzeń programów

dział ogólny

Tworzenie rozszerzeń programów

Nowy postprzez wargo » sobota, 26 września 2009, 12:01

Jak można przekazywać funkcje pomiędzy plikiem dll i programem? Chodzi mi o wywołanie w kodzie biblioteki funkcji zdefiniowanej w kodzie programu.
► 
Ostatnio edytowano piątek, 30 października 2009, 15:48 przez wargo, łącznie edytowano 3 razy
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 banita » sobota, 26 września 2009, 12:09

tak samo jakbys wywolywal zwykla funkcje z dll w swoim programie
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
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez Cyfrowy Baron » sobota, 26 września 2009, 14:45

Wyjaśnijmy sobie jedno dla ścisłości, by dla wszystkich było jasne. W bibliotece DLL nie możesz umieścić klasy jako takiej, a potem utworzyć obiekt w oparciu o tą klasę w drugiej bibliotece, gdyż druga biblioteka nie będzie miała dostępu do tej klasy. Możesz umieścić klasę w bibliotece, ale musisz w tej samej bibliotece zbudować obiekt w oparciu o tą klasę, ale druga biblioteka i tak nie będzie mogła odwoływać się do obiektu z biblioteki pierwszej bo i skąd miałaby wiedzieć o tym obiekcie. Można utworzyć w aplikacji funkcję, która będzie pośredniczyła między jedną i drugą biblioteką.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez wargo » sobota, 26 września 2009, 14:51

Chciałbym aby program/inny plik dll mógł wywoływać funkcję z klasy która jest w pliku dll tak jak normalnie:
Kod: Zaznacz cały
Plik->Załaduj("x.txt");

W powyższym przykładzie klasa plik ma znajdywać się w pliku dll a sam ten kod ma się znaleźć w programie/innym pliku 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 Cyfrowy Baron » sobota, 26 września 2009, 15:09

Zdecyduj się jednak, czy chodzi Tobie o klasę, czy też obiekt klasy, bo różnica między klasą a obiektem klasy jest taka jak np. między projektem budynku, a gotowym budynkiem.

Nie możesz umieścić klasy w jednej bibliotece, a obiektu zbudowanego w oparciu o tą klasę w bibliotece drugiej, gdyż to tak jakbyć umieścił w jednym programie klasę i chciał zbudować drugim programie obiekt w oparciu o tą klasę.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Klasy w dll

Nowy postprzez wargo » sobota, 26 września 2009, 17:54

A obiekt można utworzyć i wywołać z dll?

Ale może prostszy przykład: niech będzie że teraz chcę aby program wywoływał zwykłą funkcję z biblioteki (proste, to umiem) a ta funkcja wywołała coś z klasy umieszczonej w programie. Da się?

A teraz druga rzecz: chcę aby program załadował klasę z pliku dll i wywołał z niej funkcję.

A tak w ogóle to co z tym linkiem co podałem?
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 wargo » czwartek, 1 października 2009, 15:09

Załącz może jakiś przykład implementacji tego rozwiązania z IPlugin co podałeś w BCB.
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 » czwartek, 1 października 2009, 15:21

A czego tam nie rozumiesz?
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 » czwartek, 1 października 2009, 15:24

Nie wiem jak to wstawiać
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 » czwartek, 1 października 2009, 15:27

'To' czyli co? Nowe pozycje do menu? Przecież pokazałem jak to może wyglądać.
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 » czwartek, 1 października 2009, 15:29

Ten kod co dałeś, po prostu załącz gotowe pliki a ja to przeanalizuję
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 » czwartek, 1 października 2009, 16:53

wargo, nie będę za ciebie pisał wtyczek/rozszerzeń. Co stoi na przeszkodzie żebyś sam sobie złożył to w pliki?

Oczywiście kod, który podałem nie jest kompletny, więcej tam nie ma niż jest, ale dla kogoś, kto zna pojęcie dziedziczenia, klasy abstrakcyjnej i interfejsu nie powinno być problemu z jego uzupełnieniem.
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 » piątek, 2 października 2009, 13:53

Nie chodzi abyś pisał wtyczki tylko jakiś przykład albo dokładna informację/przykład gdzie wstawić ten kod!
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 » piątek, 2 października 2009, 15:05

Ech wargo, wargo. Tworzysz plik nagłówkowy z definicjami interfejsów i funkcji eksportowych (plugin.h):
Kod: Zaznacz cały
...

class IPlugin
{
public:
   virtual void Destroy() = 0;
   virtual int GetVersion() = 0;
   virtual const char* GetDesc() = 0;
   /* itd. */
};

class IHost
{
public:
   /* różne metody, pure virtual oczywiście */
};

IPlugin* __declspec(dllexport) createInstance(IHost *host);
...

Pisząc wtyczkę implementujesz interfejs IPlugin, tworząc klasę CPluginImpl:
Kod: Zaznacz cały
#include "plugin.h"

...

class CPluginImpl:public IPlugin
{
public:
   virtual ~CPluginImpl() { /* cośtam, cośtam */ }
   void Destroy() { delete this; }
   int GetVersion() { return 1; }
   const char* GetDesc() { return "this is my first plugin"; }
   /* itd. */
}

IPlugin* __declspec(dllexport) createInstance(IHost *host)
{
   return new CPluginImpl(host); //<--- klasa pochodna i implementująca IPlugin
}

W kodzie nie ma podziału na pliki H/CPP, ten musisz sobie zrobić sam pisząc plugina.

Od strony aplikacji, hosta twoich wtyczek, załączasz plik plugin.h coby było wiadomo czym jest IPlugin. Oczywiście musisz zaimplementować IHost'a, który udostępnia jakąś funkcjonalność wtyczkom, w sumie mógłby to być wzorzec singletona. No a dalej sprawa jasna: LoadLibrary, GetProcAddress itd. Jeśli wtyczka nie będzie już potrzebna, usuwasz ją wywołując metodę IPlugin::Destroy.

IHost'a nie będę opisywał, bo myślę, że powinieneś wiedzieć co z nim zrobić.
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 » piątek, 2 października 2009, 18:33

Nie mogę skompilować dll:
[C++ Error] Unit1.cpp(18): E2141 Declaration syntax error

Kod: Zaznacz cały
IPlugin* __declspec(dllexport) createInstance(IHost *host)
{
   return new CPluginImpl(host); //<--- klasa pochodna i implementująca IPlugin
}

Wskaźnik klawiatury pojawia się po:
Kod: Zaznacz cały
IPlugin*
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

Nastę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 2 gości