Gdybym zadeklarować funkcję tak:DLL przy użyciu __stdcall bez dekoracji nazwy: dlaczego to działa?
#ifdef TEST_EXPORTS
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif
TESTAPI int __stdcall myadd(int a, int b);
Symbol w DLL jest [email protected]
, który ma sens dla mnie (po kilku godzinach czytania inne pytania tutaj, że jest).
Ale biblioteki okien wydają się robić coś innego. Używają również __stdcall
(w przebraniu WINAPI
), ale symbole w bibliotekach DLL nie mają dekoracji nazwy. Jeśli powyższa metoda znajduje się w bibliotekach systemu Windows, symbol będzie następujący: myadd
.
Domyślam się, że używają pliku def, aby alias symboli. Ale dlaczego mój linker wie o tym, kiedy łączę się z jedną z tych bibliotek DLL?
Pliki nagłówkowe systemu Windows deklarują te funkcje jako WINAPI
, więc jeśli je wywołam, linker powinien wyszukać dekorowaną nazwę, ponieważ jest to funkcja __stdcall
. Jednak w jakiś sposób linker wie, jak zrzucić dekorację nazwy.
Próbowałem powtórzyć to, pisząc małą bibliotekę DLL i usuwając dekorację nazwy z pliku def. Zgodnie z oczekiwaniami otrzymuję błędy linkera, ponieważ linker wciąż szuka dekorowanej nazwy. Zrobiłem to w czystym C, aby upewnić się, że mangling C++ nie ma na to wpływu.
edit: wyjaśnienie, MSVC 14,0/VS2015, 32-bitowy
Należy zauważyć, że x64 nie używa dekoracji nazwy. –
@JonathanPotter: * "Zauważ, że x64 nie używa dekorowania nazw." * - Dotyczy to tylko "extern" C "'. Symbole C++ muszą mieć udekorowane nazwy eksportowe dla rozdzielczości przeciążenia. – IInspectable