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

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

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

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

20.01.2014, 14:12. Просмотров 1951. Ответов 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++
Помогите нужно составить функцию, которая определяет верно ли что сумма цифр числа четное число. обязательно использовать логическую...

Перегрузка операций (Создать класс вещественных чисел (double); определить оператор +, как функцию-элемент и – как дружественную функцию) - C++
помогите решить пожалуйста Задание 2. Бинарная операция Создать класс вещественных чисел (double).. Определить оператор +, как...

Как правильно вызвать функцию с указателем на другую функцию как параметр - C++
Вот вариант: double f(double x) { ... } double k(double (*f)(double), double y) { ...

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Avazart
Эксперт С++
7145 / 5322 / 276
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
20.01.2014, 18:26 #16
Цитата Сообщение от pEntity Посмотреть сообщение
С __declspec(dllexport)
Словарный запас закончился ?
pEntity
11 / 6 / 1
Регистрация: 12.12.2012
Сообщений: 391
20.01.2014, 18:37  [ТС] #17
Чего чего? Если нет ключевого слова __declspec(dllexport), значит это не экспортная функция.

C++
1
int __cdecl SumFunc()
Это экспортная функция ?
Avazart
Эксперт С++
7145 / 5322 / 276
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
20.01.2014, 18:42 #18
А как ты ее увидал если она не экспортная ?

Код
.text:10001000 ; void __cdecl SumFunc(void *__formal, void *__formal)
.text:10001000                 public ?SumFunc@@YAXXZ
.text:10001000 ?SumFunc@@YAXXZ proc near
Что это откуда это ты взял ?
pEntity
11 / 6 / 1
Регистрация: 12.12.2012
Сообщений: 391
20.01.2014, 18:50  [ТС] #19
Декомпил с помощью IDA

C++
1
2
3
4
extern "C" __declspec(dllexport) void _cdecl AlertMessage( ALERT_TYPE atype, char *szFmt, ... )
{
 
}
Миниатюры
Как верно экспортить функцию?  
Avazart
Эксперт С++
7145 / 5322 / 276
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
20.01.2014, 18:55 #20
Цитата Сообщение от pEntity Посмотреть сообщение
Декомпил с помощью IDA
И чЁ, наХ это было делать ? Откуда уверенность что IDA отображает правильно имена?

Смотри PE Exploer-ом
pEntity
11 / 6 / 1
Регистрация: 12.12.2012
Сообщений: 391
20.01.2014, 18:57  [ТС] #21
Я тебя не понимаю. То есть ты утверждаешь, что это экспортная функция ? int __cdecl SumFunc()

Я спрашиваю просто как сделать, чтоб ни какие символы не добавлялись.

Объясни, если у нас какие-то недопонимания.
Avazart
Эксперт С++
7145 / 5322 / 276
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
20.01.2014, 19:00 #22
Добавлено через 42 секунды
Цитата Сообщение от pEntity Посмотреть сообщение
Я спрашиваю просто как сделать, чтоб ни какие символы не добавлялись.
Объясни, если у нас какие-то недопонимания.
Выкинуть очки ... что не понятно не смотри IDA

Для заметки в нагрузку Создание в среде Borland C++ Builder dll, совместимой с Visual C++

от туда :
В таблице 1 приведены возможные варианты наименований для экспортируемой функции MyFunction, объявленной следующим образом:

extern ”C” void __declspec(dllexport) <calling convention> MyFunction(int Param);

в зависимости от соглашения о вызове (<calling convention>) и компилятора.
Соглашение о вызове VC++ C++ Builder
__stdcall _MyFunction@4 MyFunction
__cdecl MyFunction _MyFunction
Таблица 1. Наименования функций в зависимости от соглашения о вызове и компилятора.
pEntity
11 / 6 / 1
Регистрация: 12.12.2012
Сообщений: 391
20.01.2014, 19:06  [ТС] #23
IDA не обманывает. Символ лишний есть. Даже GetProcAdress ловит с лишним символом только функцию ( _SumFunc), что-то скорей всего с настройками VS.
Avazart
Эксперт С++
7145 / 5322 / 276
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
20.01.2014, 19:07 #24
Выложи DLL, а лучше весь проект...
Tulosba
20.01.2014, 21:34
  #25

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Для заметки в нагрузку Создание в среде Borland C++ Builder dll, совместимой с Visual C++
Делал я как-то "совместимую" dll, насколько помню, функции все находились, аргументы передавались, однако периодически всё крешилось. Помогла только пересборка под студией (без каких-либо изменений в коде).

Убежденный
Системный программист
Эксперт С++
15506 / 7004 / 1106
Регистрация: 02.05.2013
Сообщений: 11,440
Завершенные тесты: 1
20.01.2014, 22:40 #26
Цитата Сообщение от pEntity Посмотреть сообщение
IDA не обманывает. Символ лишний есть. Даже GetProcAdress ловит с лишним символом только функцию ( _SumFunc), что-то скорей всего с настройками VS.
Проверил ради интереса на Visual C++ 2013:
Пустой Win32-проект dll, в нем следующая функция (не считая DllMain):
C++
1
2
3
4
5
6
extern "C"
__declspec(dllexport)
int SomeFunc(int, int)
{
    return 123;
}
Скомпилировал, запустил dumpbin с параметрами /ALL и /RAWDATA:NONE.
Вот фрагмент вывода:
Код
  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
Как видим, никаких подчеркиваний.
pEntity
11 / 6 / 1
Регистрация: 12.12.2012
Сообщений: 391
20.01.2014, 23:27  [ТС] #27
Я тоже на 13 проверил уже. Все работает, а на 12 подчеркивает.
Avazart
Эксперт С++
7145 / 5322 / 276
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
21.01.2014, 02:06 #28
Цитата Сообщение от Tulosba Посмотреть сообщение
Делал я как-то "совместимую" dll, насколько помню, функции все находились, аргументы передавались, однако периодически всё крешилось. Помогла только пересборка под студией (без каких-либо изменений в коде).
Ну переносимый код вероятно лучше нежели "переносимая DLL".

Добавлено через 1 минуту
Цитата Сообщение от pEntity Посмотреть сообщение
Я тоже на 13 проверил уже. Все работает, а на 12 подчеркивает.
Странно я думал это 13 мистическое число ...

Добавлено через 2 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
Чтобы в Visual C++ получить неискаженное имя, нужно или использовать DEF-файл, или
extern "C" + _cdecl.
Насколько я понимаю DEF - файл лишь вводит псевдоним в lib файл для экспорта DLL.
HighPredator
5477 / 1843 / 343
Регистрация: 10.12.2010
Сообщений: 5,435
Записей в блоге: 3
21.01.2014, 16:03 #29
Цитата Сообщение от pEntity Посмотреть сообщение
Я тоже на 13 проверил уже. Все работает, а на 12 подчеркивает.
Стандарта спецификации по манглированию имен функций не существует (по крайней мере точно у МС), поэтому имена могут меняться в зависимости от версии компилятора. Во-вторых, существует распространенное заблуждение, жертвой которого потенциально можно стать. dllexport будет искажать имя функции в соответствии с ее описанием. То есть С++ функция будет иметь искажение характерное для С++ функции, а С для С соответственно. Использование extern "C" задает принудительно искажение, характерное для С функций, а не "отключает" его совсем. А вот чтобы экспортировать функцию действительно без искажений, нужно использовать DEF файл. Или использовать директивы компоновщика для каждой функции (нужно для того, чтобы функция с неискаженным именем имела ту же точку входа, что и искаженная).
Теперь по поводу подчеркивания. Это характерое Си искажение. Что и не удивительно, раз было указано extern C.
Avazart
Эксперт С++
7145 / 5322 / 276
Регистрация: 10.12.2010
Сообщений: 23,556
Записей в блоге: 17
21.01.2014, 16:07 #30
Цитата Сообщение от HighPredator Посмотреть сообщение
характерное для С функций
Когда это Си- ф-ции искажались декорировались ?
Причиной необходимости искажений в С++ насколько я помню это необходимость разрешения перегрузки ф-ций, которой нет в Си.

Цитата Сообщение от HighPredator Посмотреть сообщение
А вот чтобы экспортировать функцию действительно без искажений, нужно использовать DEF файл.
А если грузим динамически ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2014, 16:07
Привет! Вот еще темы с ответами:

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

не могу разобраться как написать функцию сортировки и исправить функцию добавления в стек - C++
#include &lt;iostream&gt; #include&lt;Windows.h&gt; using namespace std; struct NE{ int x; NE *pnext,*ppor,*cur;}; class SPISOK { NE...

Как передать указатель на функцию в функцию - C++
И как с ней работать?

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив) - C++
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая как параметр получает указатель на...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.01.2014, 16:07
Ответ Создать тему
Опции темы

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