Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Run-time povezivanje sa Dll-ovima ( Modulanost 3D Studio MAX-a )

[es] :: C/C++ programiranje :: Run-time povezivanje sa Dll-ovima ( Modulanost 3D Studio MAX-a )

[ Pregleda: 2530 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
213.244.208.*

ICQ: 208550327


+14 Profil

icon Run-time povezivanje sa Dll-ovima ( Modulanost 3D Studio MAX-a )21.06.2005. u 00:18 - pre 229 meseci
Vec duze vreme se "koljem" sa dll-ovima.

Impresionira me moc Dll modularnosti koju poseduje MAX. Takodje, ako ste radili sa FlyEngine-om, dovoljno je da se uradi File->Open-> i da se "ucita" Dll i program dobija funkcionalnost nove klase koju nosi doticni Dll.

Dll-ovi Imaju standardne funkcije koje se povezuju u toku izvrsenja ( npr. DllMain itd. ) Radio sam neke tutoriale koji pokazuju kako Dll-ovi rade ali oni obicno objasnjavaju da se .lib fajl koji se dobije nakon build-ovanja dll fajla moraju povezati sa exe fajlom da bi dll fajl mogao da funkcionise ( tj. da se poveze sa glavnim programom ).

Zanima me kako MAX automatski ucita Dll fajl ( u ovom slucaju plug-in, posto sam pravio neke plug-inove za MAX ). Kako obezbediti sto vecu modularnost bez nekih detalja ( .lib fajlova, .def ... ) ?




EOF
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.plus.com.



+4 Profil

icon Re: Run-time povezivanje sa Dll-ovima ( Modulanost 3D Studio MAX-a )21.06.2005. u 01:07 - pre 229 meseci
http://www.elitesecurity.org/t...xport-Dinamici-pozivi-funkcija
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
*.beotel.net.



Profil

icon Re: Run-time povezivanje sa Dll-ovima ( Modulanost 3D Studio MAX-a )21.06.2005. u 03:27 - pre 229 meseci
Svaki MAX plugin exportuje sledece funkcije:

Code:

// This function returns a string that describes the DLL and where the user
// could purchase the DLL if they don't have it.
__declspec( dllexport ) const TCHAR* LibDescription()

// This function returns the number of plug-in classes this DLL
//TODO: Must change this number when adding a new class
__declspec( dllexport ) int LibNumberClasses()

// This function returns the number of plug-in classes this DLL
__declspec( dllexport ) ClassDesc* LibClassDesc(int i)

// This function returns a pre-defined constant indicating the version of 
// the system under which it was compiled.  It is used to allow the system
// to catch obsolete DLLs.
__declspec( dllexport ) ULONG LibVersion()



Prilikom ucitavanja DLL-a MAX proverava Verziju pomocu LibVersion() a zatim poziva LibNumClasses da bi saznao koliko novih "klasa" se nalazi u DLL-u. U petlji (0..broj_klasa) poziva LibClassDesc(i) i dobija opis svake od klasa. Opis izgleda ovako:

Code:

class MojaKlasaClassDesc:public ClassDesc2 
{
public:
    int    IsPublic() { return TRUE; } 
// kreira instancu klase 
    void*    Create(BOOL loading = FALSE) { return new Htrexp01(); } 
// vraca ime klase
    const TCHAR*    ClassName() { return GetString(IDS_CLASS_NAME); }
// vraca SuperClassID
    SClass_ID    SuperClassID() { return SCENE_EXPORT_CLASS_ID; }
// vraca ClassID
    Class_ID    ClassID() { return HTREXP01_CLASS_ID; }
// vraca kategoriju plugina
    const TCHAR*    Category() { return GetString(IDS_CATEGORY); }
// vraca ime klase
    const TCHAR*    InternalName() { return _T("Htrexp01"); }    
// vraca module handle dll-a
    HINSTANCE    HInstance() { return hInstance; }                
};


Max ce sve ove ClassDesc (iz svih dll-ova) upamititi u nekoj internoj strukturi prilikom starta. Kreiranje primerka se svodi na to da ne koristis new vec da pozoves neku max funkciju kojoj saljes string ili ID klase koju zelis i MAX vraca pointer na napravljen primerak.

Sve ovo izgleda savrseno, medjutim.. daleko je od toga. MAX plugin sistem ima nekoliko nedostataka, i to su:
1. Nemoguce je unloadovati DLL. (nezgodno kada pises plugin pa moras MAX restartovati 300 puta)
2. Veoma zavisi od runtime-a. Kao sto vidis postoji metoda Create sto je neka vrsta new za tu klasu, ali ne postoji nista slicno delete. Znaci.. kada se kreira primerak klase pozva se "new" (tj. Create) iz dll-a, a kada se unistava poziva se "delete" iz MAX-a. Ako su dll i MAX prevedeni sa razlicitim run-time-om (npr vc++ 7.0 i VC++ 7.1) MAX ce pucati. Ovo je posebno nezgodno ako pokusas da koristis debug build DLL-a pa new u dll-u se poziva iz debug runtime-a, a delete iz release run-time-a, sto neminovno vodi ka pucanju MAX-a.
3. Nedostaje brojac referenci. Na ovaj nacin lako moze da se utvrdi da li DLL moze da se unloaduje iz memorije.
4. Nije type safe. Create vraca void* a programer to moze da kastuje u sta god zeli.

Ako zelis da naucis da projektujes fleksibilne plug-in sisteme pogledaj kako to radi Maya ili kako se prave COM objekti.

yooyo
 
Odgovor na temu

[es] :: C/C++ programiranje :: Run-time povezivanje sa Dll-ovima ( Modulanost 3D Studio MAX-a )

[ Pregleda: 2530 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.