Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
pEntity
11 / 6 / 1
Регистрация: 12.12.2012
Сообщений: 386
#1

Как верно экспортить функцию? - C++

20.01.2014, 14:12. Просмотров 1927. Ответов 45
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
#define _DECLARATOR_ __declspec(dllexport)
 
 
_DECLARATOR_ void __cdecl SumFunc()
{
    return;
}
C++
1
2
3
.text:10001000 ; void __cdecl SumFunc(void *__formal, void *__formal)
.text:10001000                 public ?SumFunc@@YAXXZ
.text:10001000 ?SumFunc@@YAXXZ proc near


__cdecl должно было удалить лишнии символы в стеке О_о

______________________________________________________________________________

C++
1
2
3
4
extern "C" void __declspec(dllexport) SumFunc()
{
    return;
}
C++
1
2
3
.text:10001000 ; void __cdecl SumFunc(void *__formal, void *__formal)
.text:10001000                 public _SumFunc
.text:10001000 _SumFunc        proc near
В этом варианте с __cdecl так же ничего не измениться.

________________________________________________________

C++
1
2
3
4
void __declspec(dllexport) SumFunc()
{
    return;
}
C++
1
2
3
.text:10001000 ; void __cdecl SumFunc(void *__formal, void *__formal)
.text:10001000                 public ?SumFunc@@YAXXZ
.text:10001000 ?SumFunc@@YAXXZ proc near

Так как же верно экспортить? Для чего extern "C" ? __declspec(dllexport) пихать перед void или после ? Как сделать, чтоб имя было без любых доп символов ?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2014, 14:12     Как верно экспортить функцию?
Посмотрите здесь:

Задача логические функции (составить функцию, которая определяет верно ли что сумма цифр числа четное число) - C++
Помогите нужно составить функцию, которая определяет верно ли что сумма цифр числа четное число. обязательно использовать логическую...

Как верно перевести формулу на язык c++? - C++
Приветствую! Столкнулся с такой задачей в университете на 1 курсе... нужно сделать лабораторную работу с программой на с, подробности во...

Как верно узнать размер указателя ? - C++
СBaseTest* pTest = { new СBaseTest, new СOther }; Нужно узнать размер pTest

как мне функцию одного класса в функцию базового вставить - C++
как мне функцию одного класса в функцию базового вставить??чет не хера не получается.... class Car { public : void...

Как сделать, чтобы 2 одинаковых перегруженных оператора выполнялись верно - C++
Всем привет! Столкнулся с такой ситуацией, что мне понадобилось использовать 2 перегруженных одинаковых оператора, все конечно же...

Как разделить функцию на функцию? - C++
Доброго время суток всем, подскажите как мне сделать отношение двух функций, отдельно я их решил, а как разделить 1-ю на 2-ю не знаю, ниже...

Как передать функцию в функцию? - C++
void MainWindow::_createTextEdit(QWidget *tab, QString text, void (*saveSlot)()) { ... connect(save, SIGNAL(clicked()), this,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
5474 / 1840 / 342
Регистрация: 10.12.2010
Сообщений: 5,431
Записей в блоге: 3
21.01.2014, 16:18     Как верно экспортить функцию? #31
Цитата Сообщение от Avazart Посмотреть сообщение
Когда это Си- ф-ции искажались
В моем понимании всегда. Они все имеют нижнее подчеркивание в начале. Так записано у меня по крайней мере. К тому же теория говорит о том, что соглашение Си функций cdecl дает функцию вида _MyFunct, stdcall -- _MyFunct@4, fastcall -- @MyFunct@4. Число с потолка. Поправьте где не прав.

Добавлено через 6 минут
Цитата Сообщение от Avazart Посмотреть сообщение
А если грузим динамически ?
Так логика от этого не меняется. GetProcAddr все равно требует точность в имени функции.
Убежденный
Системный программист
Эксперт С++
15295 / 6927 / 1096
Регистрация: 02.05.2013
Сообщений: 11,334
Завершенные тесты: 1
21.01.2014, 16:52     Как верно экспортить функцию? #32
Цитата Сообщение от pEntity Посмотреть сообщение
Я тоже на 13 проверил уже. Все работает, а на 12 подчеркивает.
Проверил на 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
Никакого подчеркивания снова нет.
Функция определена так:
C++
1
2
3
4
5
6
7
8
extern "C"
__declspec(dllexport)
int
_cdecl
SomeFunc2(int, int)
{
    return 456;
}
HighPredator
5474 / 1840 / 342
Регистрация: 10.12.2010
Сообщений: 5,431
Записей в блоге: 3
21.01.2014, 17:42     Как верно экспортить функцию? #33
Контрпример (см. скрин). Я ранее написал, что все зависит от компилятора. Какой-то подавит, какой-то нет. Теоретических предпосылок к гарантированному подавлению нет. Полное подавление гарантируется деф файлом.
Миниатюры
Как верно экспортить функцию?  
Avazart
Эксперт С++
7116 / 5293 / 273
Регистрация: 10.12.2010
Сообщений: 23,407
Записей в блоге: 17
21.01.2014, 17:50     Как верно экспортить функцию? #34
HighPredator, О_у это же С++Builder это чисто его прибабаха добавлять подчеркивание при чем если не ошибаюсь
эту опцию добавления можно убрать в настройках среды.
Кроме того _ вряд ли можно считать декорированием.

Мы же ту вроде говорим про VC++ и в случае ТС с его соглашением вызова не должно быть подчеркиваний и вообще искажений.

Добавлено через 3 минуты
Цитата Сообщение от HighPredator Посмотреть сообщение
Полное подавление гарантируется деф файлом.
Блин, еще раз - def ничего не подавляет в DLL просто добавляет псевдоним.
HighPredator
5474 / 1840 / 342
Регистрация: 10.12.2010
Сообщений: 5,431
Записей в блоге: 3
21.01.2014, 17:59     Как верно экспортить функцию? #35
Честно уже устал повторять...
Цитата Сообщение от Avazart Посмотреть сообщение
с его соглашением вызова не должно быть подчеркиваний и вообще искажений
there is no standard specification for name decoration, the name of an exported function might change between compiler versions
Ссыль. http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx

Добавлено через 4 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Блин, еще раз - def ничего не подавляет в DLL просто добавляет псевдоним.
Да какая разница каким словом я это обозвал? Суть то одна.
Avazart
Эксперт С++
7116 / 5293 / 273
Регистрация: 10.12.2010
Сообщений: 23,407
Записей в блоге: 17
21.01.2014, 18:09     Как верно экспортить функцию? #36
Цитата Сообщение от HighPredator Посмотреть сообщение
Где ты там видел про подчеркивание и про Си ?

Добавлено через 3 минуты
This convenience is most apparent when trying to export decorated C++ function names. Because there is no standard specification for name decoration, the name of an exported function might change between compiler versions. If you use __declspec(dllexport), recompiling the DLL and dependent .exe files is necessary only to account for any naming convention changes.
Ключевое слово C++ function, а не то что может зависеть от компилятора.

Добавлено через 1 минуту
Шагаем далее http://msdn.microsoft.com/en-US/libr...=vs.80%29.aspx

If you have functions in a DLL written in C++ that you want to access from a C-language module, you should declare these functions with C linkage instead of C++ linkage. Unless otherwise specified, the C++ compiler uses C++ type-safe naming (also known as name decoration) and C++ calling conventions, which can be difficult to call from C.

To specify C linkage, specify extern "C" for your function declarations. For example:

extern "C" __declspec( dllexport ) int MyFunc(long parm1);
HighPredator
5474 / 1840 / 342
Регистрация: 10.12.2010
Сообщений: 5,431
Записей в блоге: 3
21.01.2014, 18:17     Как верно экспортить функцию? #37
Цитата Сообщение от Avazart Посмотреть сообщение
это же С++Builder это чисто его прибабаха добавлять подчеркивание
Не для функций. http://www.agner.org/optimize/calling_conventions.pdf Раздел 8.2 Borland name mangling.

Добавлено через 4 минуты
dllexport of a function exposes the function with its decorated name. For C++ functions, this includes name mangling. For C functions or functions that are declared as extern "C", this includes platform-specific decoration that's based on the calling convention. If you don't want name decoration, use a .def file (EXPORTS keyword)
http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx

Добавлено через 3 минуты

Не по теме:

Avazart, можно было сразу ссылку спросить, а не троллить меня две страницы. Некрасиво.

Avazart
Эксперт С++
7116 / 5293 / 273
Регистрация: 10.12.2010
Сообщений: 23,407
Записей в блоге: 17
21.01.2014, 18:17     Как верно экспортить функцию? #38
For C functions or functions that are declared as extern "C", this includes platform-specific decoration that's based on the calling convention.
Речь про VC++, c эти соглашением что у ТС подчеркивания не должно быть ...

Что касается def файла, то с генерённый на его основе lib тоже не будет зависеть от компилятора.
Убежденный
Системный программист
Эксперт С++
15295 / 6927 / 1096
Регистрация: 02.05.2013
Сообщений: 11,334
Завершенные тесты: 1
21.01.2014, 18:28     Как верно экспортить функцию? #39
Цитата Сообщение от HighPredator Посмотреть сообщение
Контрпример (см. скрин). Я ранее написал, что все зависит от компилятора. Какой-то подавит, какой-то нет. Теоретических предпосылок к гарантированному подавлению нет.
Совершенно верно. name mangling, как и вообще двоичный интерфейс C++ - штука
не стандартизированная и может отличаться даже в рамках одного компилятора.
Поэтому я еще на первой странице написал:
Чтобы в Visual C++ получить неискаженное имя, нужно или использовать DEF-файл, или
extern "C" + _cdecl.
На счет других компиляторов - не знаю, с ними особо не работал.
У М. Уилсона в его книге "Imperfect C++" этот вопрос, кстати, дотошно разбирался,
вплоть до приведения "таблиц совместимости".
HighPredator
5474 / 1840 / 342
Регистрация: 10.12.2010
Сообщений: 5,431
Записей в блоге: 3
21.01.2014, 18:30     Как верно экспортить функцию? #40
Цитата Сообщение от Avazart Посмотреть сообщение
не должно быть ...
Это лирика.
Цитата Сообщение от Avazart Посмотреть сообщение
Что касается def файла, то с генерённый на его основе lib тоже не будет зависеть от компилятора.
Этот файл вообще нужен только на этапе компоновки. Компилятор тут никаким боком.
Avazart
Эксперт С++
7116 / 5293 / 273
Регистрация: 10.12.2010
Сообщений: 23,407
Записей в блоге: 17
21.01.2014, 18:47     Как верно экспортить функцию? #41
Цитата Сообщение от HighPredator Посмотреть сообщение
Это лирика.
О таблице совместимости, я ее приводил для обоих компиляторов в начале:

Соглашение о вызове VC++ C++ Builder
__stdcall _MyFunction@4 MyFunction
__cdecl MyFunction _MyFunction

Цитата Сообщение от HighPredator Посмотреть сообщение
Этот файл вообще нужен только на этапе компоновки. Компилятор тут никаким боком.
Во-вторых, объектные двоичные файлы (.obj и .lib), создаваемые BCB, несовместимы с объектными файлами VC, и, следовательно, не могут быть прилинкованы к VC-проекту. Это означает, что при желании использовать неявное связывание (linking) c dll необходимо каким-то образом создать .lib-файл (библиотеку импорта) формата, которого придерживается Microsoft.
http://www.rsdn.ru/article/devtools/bcbdll.xml
HighPredator
5474 / 1840 / 342
Регистрация: 10.12.2010
Сообщений: 5,431
Записей в блоге: 3
22.01.2014, 15:58     Как верно экспортить функцию? #42
Ну собственно я не успокоился и нашел вот что. Есть такой мануал: http://agner.org/optimize/calling_conventions.pdf в котором есть следующее (заскринил две страницы). Если кратко, то суть в том, что манглирование это не только платформо-специфичная вещь как говорилось ранее, но и компилятор-специфичная. Исходя из таблицы действительно, как и было сказано на мсдн, реально избежать манглирования можно только с помощью деф файла.
Миниатюры
Как верно экспортить функцию?   Как верно экспортить функцию?  
Avazart
Эксперт С++
7116 / 5293 / 273
Регистрация: 10.12.2010
Сообщений: 23,407
Записей в блоге: 17
22.01.2014, 16:22     Как верно экспортить функцию? #43
А что тут нового ? Смотрим в таблицу видим что при extern "C" _сdecl и компиляторе Microsoft нет подчеркивания.

Не по теме:

P.S: Хм думал что под платформой подразумевается именно компилятор/разрядность ведь dll только по Windows вроде...

HighPredator
5474 / 1840 / 342
Регистрация: 10.12.2010
Сообщений: 5,431
Записей в блоге: 3
22.01.2014, 16:26     Как верно экспортить функцию? #44
Цитата Сообщение от Avazart Посмотреть сообщение
и компиляторе Microsoft нет подчеркивания
В 64 битном нет. В 32 битном да.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2014, 16:48     Как верно экспортить функцию?
Еще ссылки по теме:

Как верно выводить указатель на двумернный массив "треугольного" типа? - C++
Суть: необхоидмо создать функцию, которая возвращала бы указатель на двумерный массив "треугольного" типа из n строк: x xx xxx ...

Как сделать функцию, которая тип данных использует как параметр? - C++
Хочу сделать функцию function("переменные", "тип данных"). Можно ли это реализовать? А именно, более подробно что-то в этом роде: ...

Как вызвать функцию чужого приложения, как подменить значения аргументов функции? - C++
собственно вопрос первый: мне нужно каким то образом из своей программы/библиотеки вызвать функцию чужого приложения, естессно...

Как подключить функцию? Как это можно исправить? - C++
#include<stdio.h> #include<math.h> #include<conio.h> #include<iostream> #pragma warning(disable: 4996) //функция генерацции ...

Указатели на функцию - как их использовать, как объявлять - C++
читаю книжку и столкнулся с указателями на функцию. автор пробегается в несколько страниц по ним, как их использовать, как объявлять. Но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Avazart
Эксперт С++
7116 / 5293 / 273
Регистрация: 10.12.2010
Сообщений: 23,407
Записей в блоге: 17
22.01.2014, 16:48     Как верно экспортить функцию? #45
Ну у меня как раз 32битка, специально скомпилил проект в MSVC++2010 - нет там никакого подчеркивания
Yandex
Объявления
22.01.2014, 16:48     Как верно экспортить функцию?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru