327 / 252 / 58
Регистрация: 12.12.2012
Сообщений: 2,048
|
|||||||||||||||||||||||||||||||
1 | |||||||||||||||||||||||||||||||
Как верно экспортить функцию?20.01.2014, 14:12. Показов 9421. Ответов 45
Метки нет (Все метки)
__cdecl должно было удалить лишнии символы в стеке О_о ______________________________________________________________________________
________________________________________________________
Так как же верно экспортить? Для чего extern "C" ? __declspec(dllexport) пихать перед void или после ? Как сделать, чтоб имя было без любых доп символов ?
0
|
20.01.2014, 14:12 | |
Ответы с готовыми решениями:
45
Как синтактически верно составить пользовательскую функцию? как сделать чтобы на label1 выходило значение верно или не верно? Как мне сделать чтобы на label1 выходило значение верно или не верно? Написать функцию,которая определяет, верно ли что последняя цифры в числе 5 |
327 / 252 / 58
Регистрация: 12.12.2012
Сообщений: 2,048
|
|
20.01.2014, 18:57 [ТС] | 21 |
Я тебя не понимаю. То есть ты утверждаешь, что это экспортная функция ? int __cdecl SumFunc()
Я спрашиваю просто как сделать, чтоб ни какие символы не добавлялись. Объясни, если у нас какие-то недопонимания.
0
|
20.01.2014, 19:00 | 22 |
Добавлено через 42 секунды
Выкинуть очки ... что не понятно не смотри IDA Для заметки в нагрузку Создание в среде Borland C++ Builder dll, совместимой с Visual C++ от туда :
0
|
327 / 252 / 58
Регистрация: 12.12.2012
Сообщений: 2,048
|
|
20.01.2014, 19:06 [ТС] | 23 |
IDA не обманывает. Символ лишний есть. Даже GetProcAdress ловит с лишним символом только функцию ( _SumFunc), что-то скорей всего с настройками VS.
0
|
Tulosba
|
20.01.2014, 21:34
#25
|
0
|
Ушел с форума
|
||||||
20.01.2014, 22:40 | 26 | |||||
Проверил ради интереса на Visual C++ 2013:
Пустой Win32-проект dll, в нем следующая функция (не считая DllMain):
Вот фрагмент вывода: Код
Section contains the following exports for mylib.dll 00000000 characteristics 52DD5DA6 time date stamp Mon Jan 20 09:32:22 2014 0.00 version 1 ordinal base 1 number of functions 1 number of names ordinal hint RVA name 1 0 00001000 SomeFunc
1
|
327 / 252 / 58
Регистрация: 12.12.2012
Сообщений: 2,048
|
|
20.01.2014, 23:27 [ТС] | 27 |
Я тоже на 13 проверил уже. Все работает, а на 12 подчеркивает.
0
|
21.01.2014, 02:06 | 28 |
Ну переносимый код вероятно лучше нежели "переносимая DLL".
Добавлено через 1 минуту Странно я думал это 13 мистическое число ... Добавлено через 2 минуты Насколько я понимаю DEF - файл лишь вводит псевдоним в lib файл для экспорта DLL.
0
|
21.01.2014, 16:03 | 29 |
Стандарта спецификации по манглированию имен функций не существует (по крайней мере точно у МС), поэтому имена могут меняться в зависимости от версии компилятора. Во-вторых, существует распространенное заблуждение, жертвой которого потенциально можно стать. dllexport будет искажать имя функции в соответствии с ее описанием. То есть С++ функция будет иметь искажение характерное для С++ функции, а С для С соответственно. Использование extern "C" задает принудительно искажение, характерное для С функций, а не "отключает" его совсем. А вот чтобы экспортировать функцию действительно без искажений, нужно использовать DEF файл. Или использовать директивы компоновщика для каждой функции (нужно для того, чтобы функция с неискаженным именем имела ту же точку входа, что и искаженная).
Теперь по поводу подчеркивания. Это характерое Си искажение. Что и не удивительно, раз было указано extern C.
0
|
21.01.2014, 16:07 | 30 |
Когда это Си- ф-ции
Причиной необходимости искажений в С++ насколько я помню это необходимость разрешения перегрузки ф-ций, которой нет в Си. А если грузим динамически ?
0
|
21.01.2014, 16:18 | 31 |
В моем понимании всегда. Они все имеют нижнее подчеркивание в начале. Так записано у меня по крайней мере. К тому же теория говорит о том, что соглашение Си функций cdecl дает функцию вида _MyFunct, stdcall -- _MyFunct@4, fastcall -- @MyFunct@4. Число с потолка. Поправьте где не прав.
Добавлено через 6 минут Так логика от этого не меняется. GetProcAddr все равно требует точность в имени функции.
0
|
Ушел с форума
|
||||||
21.01.2014, 16:52 | 32 | |||||
Проверил на VS2012 Professional:
Вывод утилиты dumpbin: Код
Section contains the following exports for mylib2.dll 00000000 characteristics 52DE5E6C time date stamp Tue Jan 21 03:47:56 2014 0.00 version 1 ordinal base 1 number of functions 1 number of names ordinal hint RVA name 1 0 00001000 SomeFunc2 Функция определена так:
0
|
21.01.2014, 17:42 | 33 |
Контрпример (см. скрин). Я ранее написал, что все зависит от компилятора. Какой-то подавит, какой-то нет. Теоретических предпосылок к гарантированному подавлению нет. Полное подавление гарантируется деф файлом.
0
|
21.01.2014, 17:50 | 34 |
HighPredator, О_у это же С++Builder это чисто его прибабаха добавлять подчеркивание при чем если не ошибаюсь
эту опцию добавления можно убрать в настройках среды. Кроме того _ вряд ли можно считать декорированием. Мы же ту вроде говорим про VC++ и в случае ТС с его соглашением вызова не должно быть подчеркиваний и вообще искажений. Добавлено через 3 минуты Блин, еще раз - def ничего не подавляет в DLL просто добавляет псевдоним.
0
|
21.01.2014, 17:59 | 35 |
Честно уже устал повторять...
Добавлено через 4 минуты Да какая разница каким словом я это обозвал? Суть то одна.
0
|
21.01.2014, 18:09 | 36 |
Где ты там видел про подчеркивание и про Си ?
Добавлено через 3 минуты Добавлено через 1 минуту Шагаем далее http://msdn.microsoft.com/en-U... 80%29.aspx
0
|
21.01.2014, 18:17 | 37 |
Не для функций. http://www.agner.org/optimize/... ntions.pdf Раздел 8.2 Borland name mangling.
Добавлено через 4 минуты Добавлено через 3 минуты Не по теме: Avazart, можно было сразу ссылку спросить, а не троллить меня две страницы. Некрасиво.
0
|
Ушел с форума
|
|
21.01.2014, 18:28 | 39 |
Совершенно верно. name mangling, как и вообще двоичный интерфейс C++ - штука
не стандартизированная и может отличаться даже в рамках одного компилятора. Поэтому я еще на первой странице написал: У М. Уилсона в его книге "Imperfect C++" этот вопрос, кстати, дотошно разбирался, вплоть до приведения "таблиц совместимости".
0
|
21.01.2014, 18:30 | 40 |
Это лирика.
Этот файл вообще нужен только на этапе компоновки. Компилятор тут никаким боком.
0
|
21.01.2014, 18:30 | |
21.01.2014, 18:30 | |
Помогаю со студенческими работами здесь
40
Составить функцию, которая определяет, верно ли, что в заданном числе все цифры стоят по возрастанию Задача логические функции (составить функцию, которая определяет верно ли что сумма цифр числа четное число) ДМ. Логически доказать равенство; и что вложение верно, а обратное не верно; построить формулу Даны три числа a,b,c . Выяснить, верно ли, что a<b<c. Ответ получить в текстовой форме: верно или неверно Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |