VC++

Чудны дела твои, Билли! Для того, чтобы функция из DLL импортировалась под своим именем (GetProcAddress(dllHandler, «some_func»), какой-то забавный дядя в недрах Microsoft придумал вот такую строку:

extern «C» __declspec(dllexport) int __cdecl some_func(void)

кого мне за это расцеловать? кто-нибудь знает, почему сделано так, а не иначе?

Комментарии 10

Dima № 1
А чем плохо-то?
Евгений Степанищев автор № 2
Писать 3 директивы для того, чтобы VC вписал в DLL ф-ю именно под тем именем, под которым я её назвал?
Dima № 3
Писать 3 директивы для того, чтобы VC вписал в DLL ф-ю именно под тем именем, под которым я её назвал?

Вообще-то эти директивы каждая предназначена для своих целей…

Евгений Степанищев автор № 4
Но, если не поставить хотябы одну, ф-я экспортируется не под своим родным именем, а в виде близком к «?some_func@0»
Dima № 5
extern "C' — это как раз для распознавания имени [ http://msdn.microsoft.com/library/default. … tables.asp ],
__declspec(dllexport) — это для экспорта в DLL [ http://msdn.microsoft.com/library/default. … ort.29.asp ],
__cdecl — для изменения обработки переменных в стеке [ http://msdn.microsoft.com/library/default. … _cdecl.asp ]
Евгений Степанищев автор № 6
Но, если не поставить хотябы одну, ф-я экспортируется не под своим родным именем, а в виде близком к «?some_func@0»
Евгений № 7
extern 'C' нужно, потому что в С++ к имени функции приписываются ее параметры -— это придумал Страуструп для контроля типа функции.
Евгений Степанищев автор № 8
Страус труп, а нам мучаться. Вот уродец. А как такую функцию потом загружать? Под каким именем?
Dima № 9
extern 'C' нужно, потому что в С++ к имени функции приписываются ее параметры -— это придумал Страуструп для контроля типа функции.

Ну да, я ведь и говорю, что именно это нужно для того, чтобы функция экспортировалась под своим именем, а всё остальное (dllexport, __cdecl) для других целей.

Евгений Степанищев автор № 10
В том-то и прикол, что без любой из директив получается что-то вроде «?some_func@0»