Ovo je definitivno najlakse:
Code:
DLL:
extern "C" __declspec(dllexport) return_type FuncName( int param )
{
...
}
Prevedi ga kao MyDLL.dll
Napravi MyDLL.h file i ubaci:
Code:
typedef return_type* (__cdecl * PFNFuncName)(int param);
Negde u exe programu:
Code:
#include "MyDLL.h"
PFNFuncName FuncName;
HMODULE h = LoadLibrary("MyDLL.dll");
if (h!=NULL)
{
FuncName = (PFNFuncName) GetProcAddress(h, "FuncName");
if (FuncName == NULL)
{
// error
}
else
{
// pozovi func
FuncName(23);
}
}
Ako imas mnogo exportovanih funkcija onda je prilicno maltretiranje da pokupis sve entry points. Postoji jednostavnije resenje. Napravi ciste virtuelnu klasu i exportuj samo jednu funkciju koja vraca pointer na implementaciju te klase. Primer:
Code:
IMyClass.h: (interface-to-my-class)
class IMyClass
{
public:
IMyClass(){};
virtual ~IMyClass(){};
virtual int Metoda1(int p1, int p2) = 0;
virtual float Metoda2(float p1, int p2) = 0;
...
};
typedef IMyClass* (__cdecl * NewInstanceOfMyClass)(void);
typedef void (__cdecl * DeleteInstanceOfMyClass)(IMyClass* p);
Zatim napravi implementaciju IMyClass:
Code:
MyClass.h:
class MyClass: public IMyClass
{
public:
MyClass();
~MyClass();
int Metoda1(int p1, int p2);
float Metoda2(float p1, int p2);
...
}
MyClass.cpp
extern "C" __declspec(dllexport) IMyClass* NewInstanceOfMyClass(void)
{
return new MyClass;
}
extern "C" __declspec(dllexport) void DeleteInstanceOfMyClass(IMyClass* p)
{
if (p!=NULL) delete p;
}
A sada spektakl...
Code:
exe:
main.cpp:
#include "IMyClass.h"
PFNNewInstanceOfMyClass NewInstanceOfMyClass;
PFNDeleteInstanceOfMyClass DeleteInstanceOfMyClass;
// ovde ide LoadLibrary i GetProcAddress(h, "NewInstanceOfMyClass"); i GetProcAddress(h, "DeleteInstanceOfMyClass");
IMyClass* pMyClass = NewInstanceOfMyClass();
pMyClass->Metoda1(23,34); // pozivanje metode u DLL-u;
DeleteInstanceOfMyClass(pMyClass);
Ovde sam ubacio NewInstanceOfMyClass i DeleteInstanceOfMyClass zato sto je prilicno lose da alociras memoriju u dll-u a oslobadjas iz glavnog programa sa delete, jer ako su exe i dll prevedeni sa razlicitim run-time bibliotekama program moze da puca.
Ako jos malo razmislis o ovom metodu vrlo lako mozes da napravis solidan plugin sistem za tvoj program. Npr.. razmisli o tome kako bi izveo da neki dll exportuje vise klasa!
yooyo