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

Komunikacija dva DLL-a problem !

[es] :: C/C++ programiranje :: Komunikacija dva DLL-a problem !

Strane: 1 2

[ Pregleda: 4305 | Odgovora: 22 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.55.*



+9 Profil

icon Re: Komunikacija dva DLL-a problem !18.09.2006. u 08:45 - pre 214 meseci
Citat:
kiklop74: Ovo je netacno. Svi windows kompajleri (pa i Borlandov) po defaultu koriste __cdecl. Kao i sve drugo i ovo se moze promeniti pa je zato uvek preporucljivo definisati u hederima koja konvencija se koristi za neku funkciju/klasu/promenjivu itd.
Ne bih se složio. Pogledaj što se točno nalazi u dll-u nakon compiliranja istog dll-a unutar BCBa i VC++a. Sasvim drukčiji nazivi funkcija i to baš zbog konvencije (isprobano). :)
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.iplannetworks.net.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Komunikacija dva DLL-a problem !18.09.2006. u 14:12 - pre 214 meseci
Ovaj put nisi u pravu. To o cemu govoris je nacin na koji msvc i borland eksportuju C funkcije sa __cdecl konvencijom i koji nije identican.

Da razjasnimo dve stvari:

1. calling conventions odredjuju nacin na koji ce parametri neke funkcije biti prosledjeni.
2. name mangling opisuje nacin na koji ce se generisati ime eksportovane funkcije i to delom zavisi i od konvencije funkcije.

Po pravilu C funkcije sa __cdecl konvencijom treba da budu eksportovane pod imenom _<imefunkcije> ALI microsoft je resio da uradi stvari drugacije od ostalih kompajlera tako da svaka eksportovana C funkcija u msvc ce imati eksportovano ime BEZ _ bas kao da je koriscena __stdcall konvencija i otuda zabuna.

Dakle ako imamo ovakvu funkciju:

Code:

#ifdef __cplusplus
extern "C" {
#endif

#ifdef DLLTEST_EXPORTS
#define DLLTEST_API __declspec(dllexport)
#else
#define DLLTEST_API __declspec(dllimport)
#endif

DLLTEST_API void __cdecl testcdecl(int intParam);
DLLTEST_API void __stdcall teststdcall(int intParam);

#ifdef __cplusplus
}
#endif


U MSVC ce biti eksportovane ovako:
Ordinal Name
2 _teststdcall@4
1 testcdecl

I sad se verovatno pitas kako onda svi sistemski dll'ovi kompajlirani sa msvc koji koriste konvenciju __stdcall nemaju ove kuke i kvake?

Jednostavno - microsoft ovo resava koriscenjem DEF fajlova. Sa Def fajlovima se moze promeniti naziv eksportovane funkcije po potrebi. Ako se koristi def fajl za eksportovanje onda __declspec(dllexport) treba ukloniti. U ovom slucaju def fajl bi izgledao ovako:

Code:
LIBRARY    dlltest2
EXPORTS
  teststdcall = _teststdcall@4
  testcdecl


Posle kompajliranja eksporti izgledaju ovako:
Ordinal Name
2 teststdcall
1 testcdecl

Borlandov kompajler radi stvari na standardan nacin i nisu potrebne nikakve posebne egzibicije (osim u slucaju kada treba da se koristi neki dll kompajliran sa msvc).

Kod iz prethodnog primera kompajliran u Turbo C++ ce eksportovati funkcije ovako:
Ordinal Name
1 _testcdecl
2 teststdcall

Tako da na kraju mozemo da zakljuciti da je glavna razlika u nacinu na koji razliciti kompajleri generisu imena pod kojima se eksportuju funkcije.

Tko leti vrijedi
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.55.*



+9 Profil

icon Re: Komunikacija dva DLL-a problem !19.09.2006. u 07:59 - pre 214 meseci
Sa ovolikim obrazloženjem moram da se složim :) Naravno, ja sam svoj zaključak donio isključivo na osnovu toga što sam primjetio na koji način oba compilera spremaju funkcije u dll i da se te razlike među imenima (underscore...) baš eliminiraju odabirom konvencije. Naravno, postoje opcije i u compileru, no to je manje bitno.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Komunikacija dva DLL-a problem !

Strane: 1 2

[ Pregleda: 4305 | Odgovora: 22 ] > FB > Twit

Postavi temu Odgovori

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