Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 20.9.2010, 11:23   #1
tchalle
Član
 
Član od: 24.8.2010.
Lokacija: BG
Poruke: 44
Zahvalnice: 49
Zahvaljeno 18 puta na 12 poruka
Određen forumom 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?
tchalle je offline   Odgovor sa citatom ove poruke
Stara 20.9.2010, 11:43   #2
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.163
Zahvalnice: 2.081
Zahvaljeno 4.922 puta na 2.858 poruka
Određen forumom 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.
voodoo_ je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku voodoo_ na korisnoj poruci:
tchalle (20.9.2010)
Stara 21.9.2010, 1:40   #3
Boris B.
Član
 
Član od: 3.5.2006.
Lokacija: Beograd
Poruke: 101
Zahvalnice: 11
Zahvaljeno 11 puta na 10 poruka
Određen forumom 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.
Boris B. je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Boris B. na korisnoj poruci:
tchalle (21.9.2010)
Stara 21.9.2010, 5:07   #4
tchalle
Član
 
Član od: 24.8.2010.
Lokacija: BG
Poruke: 44
Zahvalnice: 49
Zahvaljeno 18 puta na 12 poruka
Određen forumom 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.
tchalle je offline   Odgovor sa citatom ove poruke
Stara 21.9.2010, 16:31   #5
tchalle
Član
 
Član od: 24.8.2010.
Lokacija: BG
Poruke: 44
Zahvalnice: 49
Zahvaljeno 18 puta na 12 poruka
Određen forumom 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.
tchalle je offline   Odgovor sa citatom ove poruke
Stara 21.9.2010, 18:47   #6
Boris B.
Član
 
Član od: 3.5.2006.
Lokacija: Beograd
Poruke: 101
Zahvalnice: 11
Zahvaljeno 11 puta na 10 poruka
Određen forumom 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
Boris B. je offline   Odgovor sa citatom ove poruke
Stara 21.9.2010, 19:11   #7
tchalle
Član
 
Član od: 24.8.2010.
Lokacija: BG
Poruke: 44
Zahvalnice: 49
Zahvaljeno 18 puta na 12 poruka
Određen forumom 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.
tchalle je offline   Odgovor sa citatom ove poruke
Stara 21.9.2010, 22:06   #8
Boris B.
Član
 
Član od: 3.5.2006.
Lokacija: Beograd
Poruke: 101
Zahvalnice: 11
Zahvaljeno 11 puta na 10 poruka
Određen forumom 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.
Boris B. je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Boris B. na korisnoj poruci:
tchalle (21.9.2010)
Stara 21.9.2010, 22:40   #9
tchalle
Član
 
Član od: 24.8.2010.
Lokacija: BG
Poruke: 44
Zahvalnice: 49
Zahvaljeno 18 puta na 12 poruka
Određen forumom 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.
tchalle je offline   Odgovor sa citatom ove poruke
Stara 21.9.2010, 23:17   #10
Boris B.
Član
 
Član od: 3.5.2006.
Lokacija: Beograd
Poruke: 101
Zahvalnice: 11
Zahvaljeno 11 puta na 10 poruka
Određen forumom 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)
Onda u Test.c implementiraj prototipe:
Kod:
tip imeFunkcije(parametri)
{
  // Kod
}
Npr.
-Test.h
Kod:
extern "C" void __declspec(dllexport) __stdcall f(void)
-Test.c
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.
Boris B. je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Boris B. na korisnoj poruci:
tchalle (21.9.2010)
Stara 21.9.2010, 23:44   #11
tchalle
Član
 
Član od: 24.8.2010.
Lokacija: BG
Poruke: 44
Zahvalnice: 49
Zahvaljeno 18 puta na 12 poruka
Određen forumom 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.
tchalle je offline   Odgovor sa citatom ove poruke
Stara 24.9.2010, 16:55   #12
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.163
Zahvalnice: 2.081
Zahvaljeno 4.922 puta na 2.858 poruka
Određen forumom Re: Kako se pravilno prave DLL-ovi?

Registracija je besplatna.
voodoo_ je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi

Alatke vezane za temu
Vrste prikaza

Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


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


Sva vremena su po Griniču +2 h. Sada je 3:37.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com