
// wtyczka wywołuje
m_host->SetEditLabel("jakiś tekst");
...
//host implementuje
void CHostImpl::SetEditLabel(const char *label)
{
m_edit1->Text = label;
}


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



typedef (*acreateInstance)();IPlugin* __declspec(dllexport) createInstance(IHost *host);class IPlugin
{
public:
__fastcall CPluginImpl(); //<--- to to tu robi u diabła?!?!?!
...
};
GetProcAddress(DLLHandle, "_createInstance");
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ę???
polymorphism napisał(a):PS. w zasadzie powinno tam być jeszcze extern "C", przeoczyłem![]()
polymorphism napisał(a):
- Kod: Zaznacz cały
class IPlugin
{
public:
__fastcall CPluginImpl(); //<--- to to tu robi u diabła?!?!?!
...
};
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.
polymorphism napisał(a):Dałeś w unit1.cpp implementację metody CHostImpl::SetEditLabel, ale gdzie jest deklaracja klasy CHostImpl, która dziedziczy po IHost???

A nie ma być?
Nie, bo to ma być dynamicznie!
Konstruktor
No właśnie do tego zmierzam!

Ż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):Odsyłam do książek...A nie ma być?
polymorphism napisał(a):Dałeś w unit1.cpp implementację metody CHostImpl::SetEditLabel, ale gdzie jest deklaracja klasy CHostImpl, która dziedziczy po IHost???

Powiedz co sądzisz o tym sposobie.
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

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.

...
#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*);
#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);
}
#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();
...
[C++ Error] ccc.cpp(8): E2303 Type name expected
ostream& m_os;#include <ostream>
Powrót do Ogólne problemy z programowaniem
Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 0 gości