|
Programiranje Programski jezici, tehnike, alatke... |
|
Alatke vezane za temu | Vrste prikaza |
20.9.2010, 11:23 | #1 |
Član
Član od: 24.8.2010.
Lokacija: BG
Poruke: 44
Zahvalnice: 49
Zahvaljeno 18 puta na 12 poruka
|
Kako se pravilno prave DLL-ovi?
Sistemski DLL-ovi se mogu koristiti iz svih jezika i kompajlera.Pre odredjenog vremena
sam probao da napravim DLL (svoj prvi), i da ga ucitam iz MS kompajlera i dobio sam neke cudne rezultate.DLL sam pravio u Watcom kompajleru,u C-u, sa new projekt dll. U cemu se moj DLL razlikuje od sistemskih DLL-ova i kako se prave DLL -ovi koji se mogu ucitati iz svih jezika i kompajlera? |
20.9.2010, 11:43 | #2 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.086
Zahvaljeno 4.923 puta na 2.859 poruka
|
Re: Kako se pravilno prave DLL-ovi?
Trebalo bi da koristiš što noviji Visual Studio da izbegneš takve probleme. VS unosi neka olakšanja kod exportovanja funkcija iz DLL-a, pa je manje cimanje programirati u njemu.
Drugo, moraš da vodiš računa o redosledu prosleđivanja parametara u funkciji, odnosno da li se na stek guraju i skidaju od prve do poslednje ili obrnuto http://en.wikipedia.org/wiki/Calling_convention http://msdn.microsoft.com/en-us/libr...8VS.71%29.aspx Ako si funkciju napravio po jednoj konvenciji a funkcija iz EXE-a koji poziva tu funkciju radi drugačije, imaćeš problema. Tako da ne možeš baš da napraviš DLL sa funkcijama koje će raditi iz SVIH exe fajlova, pošto ti DLL-ove prvenstveno praviš kao delove svojih programa, ili delove drugih programa za čiji API imaš dobru dokumentaciju, itd. |
Sledeći korisnik se zahvaljuje korisniku voodoo_ na korisnoj poruci: | ||
tchalle (20.9.2010) |
21.9.2010, 1:40 | #3 |
Član
Član od: 3.5.2006.
Lokacija: Beograd
Poruke: 101
Zahvalnice: 11
Zahvaljeno 11 puta na 10 poruka
|
Re: Kako se pravilno prave DLL-ovi?
U prinicipu koristi kompajler koji hoćeš, samo koristi stdcall kod eksportovanih funkcija i radiće sa bilo kojim iole normalnim Win32 kompajlerom (čitaj: svima).
"Sistemski DLL"-ovi koje pominješ (WinAPI) koriste stdcall i svi win32 kompajleri će ga podrzavati ako ništa drugo zbog neophodne kompatibilnosti sa WinAPI-em. Ako nisi siguran kako "spolja izgleda" dll koji si napravio skini besplatan dependancy walker (odličan za analiziranje DLL-ova) i pogledaj kako tvoj dll izgleda. |
Sledeći korisnik se zahvaljuje korisniku Boris B. na korisnoj poruci: | ||
tchalle (21.9.2010) |
21.9.2010, 5:07 | #4 |
Član
Član od: 24.8.2010.
Lokacija: BG
Poruke: 44
Zahvalnice: 49
Zahvaljeno 18 puta na 12 poruka
|
Re: Kako se pravilno prave DLL-ovi?
Poveo sam se za Petzoldi.
On je definisao makro #define EXPORT __declspec (dllexport) I onda funkcije EXPORT void f(void) ; EXPORT long nzd(int numb, ...); EXPORT long nzs (int numb, ... ); EXPORT long nzda(int numb, int * niz); EXPORT long nzsa (int numb, int * niz ); a treba verovatno EXPORT void _stdcall f(void) ; EXPORT long _stdcall nzd(int numb, ...); EXPORT long _stdcall nzs (int numb, ... ); EXPORT long _stdcall nzda(int numb, int * niz); EXPORT long _stdcall nzsa (int numb, int * niz ); Davno sam se bavio ovim ali tada nisam imao gde da pitam. Dependency Walker prepoznaje eksport funkcije. Hvala puno na pomoci. |
21.9.2010, 16:31 | #5 |
Član
Član od: 24.8.2010.
Lokacija: BG
Poruke: 44
Zahvalnice: 49
Zahvaljeno 18 puta na 12 poruka
|
Re: Kako se pravilno prave DLL-ovi?
Sada sam probao i ne ide onako kako mali Djokica zamislja programiranje.
Hvala svima na pomoci, kada budem imao vise vremena probacu ponovo. |
21.9.2010, 18:47 | #6 |
Član
Član od: 3.5.2006.
Lokacija: Beograd
Poruke: 101
Zahvalnice: 11
Zahvaljeno 11 puta na 10 poruka
|
Re: Kako se pravilno prave DLL-ovi?
__declspec je microsoft specific za C++, razumeo sam te da koristis neki alternativni kompajler. Ako koristis __declspec onda je pravilno ono prvo, tj, EXPORT void f(void) i trebalo bi da bude callable spolja, tj. iz procesa koji koristi DLL
|
21.9.2010, 19:11 | #7 |
Član
Član od: 24.8.2010.
Lokacija: BG
Poruke: 44
Zahvalnice: 49
Zahvaljeno 18 puta na 12 poruka
|
Re: Kako se pravilno prave DLL-ovi?
Koristim Watcom kompiler.U njegovim primerima takodje stoji __declspec.
Koristim i MS kompajler.Imam i Petzoldi-ovu knjigu.Imam negde i Weirdov kod ali ne mogu da nadjem nigde gde je pravio DLL i kako je to radio. Kada stavim _stdcall menja mi imena funkcija: C:\Documents and Settings\chale\My Documents\dll\test.dll ======[ IMAGE_EXPORT_DIRECTORY ]====== Name of the module: test.dll nBase: 1 NumberOfFunctions: 5 NumberOfNames: 5 AddressOfFunctions: 5034 AddressOfNames: 5048 AddressOfNameOrdinals: 505C RVA Ord. Name ---------------------------------------------- 1018 1 _f@0 16C3 3 _nzd 1840 5 _nzda@8 1447 2 _nzs 178F 4 _nzsa@8 Inace kada stavim onako kako sam prvo napisao ostavlja normalna imena funkcija. Kasnije cu detaljno prouciti u cemu je problem.DLL-ove sam davno pravio ali tada nisam imao gde da pitam.Nisam znao za ovaj forum. |
21.9.2010, 22:06 | #8 |
Član
Član od: 3.5.2006.
Lokacija: Beograd
Poruke: 101
Zahvalnice: 11
Zahvaljeno 11 puta na 10 poruka
|
Re: Kako se pravilno prave DLL-ovi?
Menja ti imena funkcija zato sto postoji razlika izmedju C i C++ funkcija. C++ funkcije su u stvari metodi objekata u OOP terminologiji i kada ih eksportujes u DLL onda se tzv. "dekorišu", dodaju se jos informacije o klasi i ostalo.
Ako hoces da ti je funkcija callable i iz obicnog C-a koristi sledeću formu koja je kompatibilna i sa Watcomom i sa Visual C++-om i ostalim kompajlerima: U DLL-u (export): extern "C" type __declspec(dllexport) __stdcall imeFunkcije(parametri) { //kod funkcije } U programu (import): //prototip u .h extern "C" type __declspec(dllimport) __stdcall imeFunkcije(parametri); //Negde u .c ili .cpp rezultat = imeFunkcije(parametri) Javi ako opet neće ili okači DLL u RAR-u. |
Sledeći korisnik se zahvaljuje korisniku Boris B. na korisnoj poruci: | ||
tchalle (21.9.2010) |
21.9.2010, 22:40 | #9 |
Član
Član od: 24.8.2010.
Lokacija: BG
Poruke: 44
Zahvalnice: 49
Zahvaljeno 18 puta na 12 poruka
|
Re: Kako se pravilno prave DLL-ovi?
Ovde je okacena verzija koja radi sa Watcom-om i sa MASM-om ali ne radi sa VS6.
Znam da lib i obj datoteke ne rade izmedju Watcom i VS6 kompajlera, pa pretpostavljam da ni DLL nece. a.c je spageti sors kod.Probao sam da vidim i kako se DLL ponasa pri velikoj alokaciji memorije i dobro je podnosi. Hvala na trudu. |
21.9.2010, 23:17 | #10 |
Član
Član od: 3.5.2006.
Lokacija: Beograd
Poruke: 101
Zahvalnice: 11
Zahvaljeno 11 puta na 10 poruka
|
Re: Kako se pravilno prave DLL-ovi?
Nemam kući visual studio, ali na osnovu koda koji si postavio vidim sta bi moglo da bude. Kad si iskompajlirao DLL pored DLL-a treba da postoji i LIB (Test.lib). Linkuj taj LIB sa svojim projektom u Visual C-u i koristi onu formu koju sam ti gore napisao a ne LoadLibrary i GetProcAddress.
Znaci: 1. U projektu za Test.dll u fajlu Test.h napravi prototipe kao: Kod:
extern "C" tip __declspec(dllexport) __stdcall imeFunkcije(parametri) Kod:
tip imeFunkcije(parametri) { // Kod } -Test.h Kod:
extern "C" void __declspec(dllexport) __stdcall f(void) Kod:
void f(void) { MessageBox(...); } 2. Iskompajliraj DLL projekat 3. Iskopiraj Test.dll, Test.lib i Test.h u novi projekat koji koristi dll 4. Promeni sve dllexport u Test.h u dllimport 5. U svom .c fajlu dodaj #include Test.h 6. Dodaj Test.lib u linker 7. Zovi funkciju normalno iz koda, npr f(); Korak 4 se obicno izbegne define-ovima ali pusti to za sada. Ako ti i dalje nece onda koristi tvoj nacin i samo dodaj __stdcall u typedef funkcije, a ako i dalje nece promeni GetProcAddress da ne koristi ime funkcije nego redni broj. |
Sledeći korisnik se zahvaljuje korisniku Boris B. na korisnoj poruci: | ||
tchalle (21.9.2010) |
21.9.2010, 23:44 | #11 |
Član
Član od: 24.8.2010.
Lokacija: BG
Poruke: 44
Zahvalnice: 49
Zahvaljeno 18 puta na 12 poruka
|
Re: Kako se pravilno prave DLL-ovi?
"C" Invalid declarator, a kada bolje razmislim extern "c" je iz jezika c++ citao sam Miliceva pre jedno 10 godina.A bez toga "c" menja imena funkcija.Malo sam u medjuvremenu radio i namestio sam da cita iz VS6 onako sa crtom dole
void f_(void) radi a rade i funkcije koje se pozivaju sa neodredjenim brojem argumenata.Pada u mrtvu petlju kod poziva funkcija kod poziva (int,int*). Greska nije u kodu posto kod radi kada se zove iz watkoma ili kada se prevede u VS6 kao charter mode program. Imam VC++2010 ekspres ali on trazi registraciju a i ovako ne umem da ga koristim. Hvala PUNO na pomoci i na trudu. |
24.9.2010, 16:55 | #12 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.166
Zahvalnice: 2.086
Zahvaljeno 4.923 puta na 2.859 poruka
|
Re: Kako se pravilno prave DLL-ovi?
Registracija je besplatna.
|
Bookmarks sajtovi |
|
|
Slične teme | ||||
tema | temu započeo | forum | Odgovora | Poslednja poruka |
Kako napraviti igru! (Iz perspektive programera...) | sasha vukelic | Pravljenje igara | 138 | 24.9.2016 20:36 |
Detaljno objašnjenje - kako napraviti forum i sajt | miša topola | Web dizajn | 32 | 2.1.2011 14:12 |
Kako kontaktirati Blizzard. | kreator_ | MMORPG igre | 0 | 15.2.2009 15:09 |
Kako menjati boju automobila u photoshopu? | freeminder | Grafički softver i radovi | 16 | 31.10.2007 17:03 |