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.