Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 22 odgovora
  • 6.412 pregleda

Najnovija ↓

Re: Komunikacija dva DLL-a problem ! 18.09.2006. u 09:45 · pre 244 meseca #21
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). :)
Re: Komunikacija dva DLL-a problem ! 18.09.2006. u 15:12 · pre 244 meseca #22
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.
Potpis
Tko leti vrijedi
Re: Komunikacija dva DLL-a problem ! 19.09.2006. u 08:59 · pre 244 meseca #23
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.
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme