VC++

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

extern "C" __declspec(dllexport) int __cdecl some_func(void)

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

21 марта 2003 16:41

Dima (инкогнито)
22 марта 2003, 10:10

А чем плохо-то?

bolk (bolknote.ru)
22 марта 2003, 10:10, ответ предназначен Dima

Писать 3 директивы для того, чтобы VC вписал в DLL ф-ю именно под тем именем, под которым я её назвал?

Dima (инкогнито)
22 марта 2003, 12:14

<blockquote>Писать 3 директивы для того, чтобы VC вписал в DLL ф-ю именно под тем именем, под которым я её назвал?</blockquote>
Вообще-то эти директивы каждая предназначена для своих целей…

bolk (bolknote.ru)
22 марта 2003, 12:14, ответ предназначен Dima

Но, если не поставить хотябы одну, ф-я экспортируется не под своим родным именем, а в виде близком к «?some_func@0»

Dima (инкогнито)
22 марта 2003, 12:30

extern "C' — это как раз для распознавания имени [ >>> (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_Export_C_Functions_for_Use_in_C_or_C.2b2b_.Language_Executables.asp) ],
__declspec(dllexport) — это для экспорта в DLL [ >>> (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/_core_using___declspec.28.dllimport.29_.and___declspec.28.dllexport.29.asp) ],
__cdecl — для изменения обработки переменных в стеке [ >>> (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_core___cdecl.asp) ]

bolk (bolknote.ru)
22 марта 2003, 12:30, ответ предназначен Dima

Но, если не поставить хотябы одну, ф-я экспортируется не под своим родным именем, а в виде близком к «?some_func@0»

Евгений (инкогнито)
23 марта 2003, 01:29

extern 'C' нужно, потому что в С++ к имени функции приписываются ее параметры -— это придумал Страуструп для контроля типа функции.

bolk (bolknote.ru)
23 марта 2003, 01:29, ответ предназначен Евгений

Страус труп, а нам мучаться. Вот уродец. А как такую функцию потом загружать? Под каким именем?

Dima (инкогнито)
23 марта 2003, 08:00

<blockquote>extern 'C' нужно, потому что в С++ к имени функции приписываются ее параметры -— это придумал Страуструп для контроля типа функции. </blockquote>
Ну да, я ведь и говорю, что именно это нужно для того, чтобы функция экспортировалась под своим именем, а всё остальное (dllexport, __cdecl) для других целей.

bolk (bolknote.ru)
23 марта 2003, 08:00, ответ предназначен Dima

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)