Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/10: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Кот Ангенс
318 / 268 / 128
Регистрация: 24.05.2012
Сообщений: 629
#1

Импорт функции __stdcall из DLL

17.03.2013, 09:51. Просмотров 1859. Ответов 6
Метки нет (Все метки)

C++
1
2
3
4
5
6
//maindll.cpp:
#include <windows.h>
 
extern "C"
__declspec(dllexport)
void WINAPI foo() { }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//main.cpp:
#include <iostream>
#include <windows.h>
#include <tchar.h>
 
using namespace std;
 
int main() {
    auto dll = LoadLibrary(_T("TestDLL.dll"));
    auto foo = (void (WINAPI *)())GetProcAddress(dll, "foo");
    cout << bool(dll) << ' ' << bool(foo);
    FreeLibrary(dll);
    cin.get();
}
Выдает "1 0". GCC в составе Code::Blocks.

Добавлено через 15 часов 11 минут
__cdecl-функции импортируются нормально. Скажите, пожалуйста, в чем может быть ошибка?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2013, 09:51
Ответы с готовыми решениями:

[Embarcadero] DLL импорт
Здравствуйте, столкнулся с проблемой с импортом библиотеки. Скачал с GitHub...

Импорт из dll перегруженных операторов
Здравствуйте, уважаемые программисты! По заданию необходимо при явном...

Импорт значений из txt файла в dll
Подскажите пожалуйста, как можно импортировать данные из txt файла в dll...

Импорт функции
У меня есть библиотека в такой функцией #define THIS_EXPORT __declspec...

Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями?
Движок перевожу на платформу Win64 и нужно, чтобы разрядность ЕХЕ и DLL...

6
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.03.2013, 10:05 #2
Экспортируемые имена, доступные в готовой dll смотрели?
1
Кот Ангенс
318 / 268 / 128
Регистрация: 24.05.2012
Сообщений: 629
17.03.2013, 10:24  [ТС] #3
Спасибо за совет. Забавная картина: показано, что DLL экспортирует функцию foo@0, т. е. extern "C" как бы не действует. Если заменить в тестирующей программе "foo" на "foo@0", функция импортируется и вызывается.

В принципе, на ближайшее время мне хватит и этого, но все же хотелось бы знать, как запретить вставлять в имя функции информацию об аргументах.
0
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.03.2013, 10:47 #4
Если dll чисто сишная, то и собирать ее надо как си, а не си++. Ну или можно еще использовать библиотеки импорта.
0
Кот Ангенс
318 / 268 / 128
Регистрация: 24.05.2012
Сообщений: 629
17.03.2013, 10:56  [ТС] #5
Сишная сборка ничего не дала. А что такое библиотеки импорта?
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,528
17.03.2013, 11:11 #6
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
extern "C" как бы не действует.
действует, но этого мало. Надо так:
C++
1
2
3
4
5
6
//maindll.cpp:
#include <windows.h>
 
extern "C"
__declspec(dllexport)
void __cdecl foo() { }
, если приписать ещё WINAPI, то не скомпилится, не знаю почему. Предполагаю, что WINAPI определено как __stdcall и получается противоречие, в одном объявлении два разных соглашения о вызовах.

А здесь я набросал табличку в каком файле какое имя получается при разных вариантах компиляции:
0
Вложения
Тип файла: rar имена.rar (7.9 Кб, 22 просмотров)
Tulosba
:)
Эксперт С++
4747 / 3241 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.03.2013, 15:24 #7
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
Сишная сборка ничего не дала. А что такое библиотеки импорта?
Про библиотеки импорта например почитать можно тут.
Для сишной сборки вероятно надо убрать extern c, ну и убедиться, что действительно собирается как си. Т.е. экпортируемые имена не искажены. Обычно для этого хватает переименовать файлы проекта с *.cpp на *.c, ну и может быть сам проект сделать си вместо си++. Смотря в какой среде создается библиотека.
0
17.03.2013, 15:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2013, 15:24

DLL и Функции
Всем привет форумчани :) Есть такой вопрос :) Как написать длл чтоб при вызове...

Вызов функции из dll
Привет всем! Пишу программу на Java. Спокойно, форум тот... Моя программа...

Вызов функции из dll
Доброго времени суток! Пытаюсь вызвать функцию, которая находится в библиотеке...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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