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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
#1

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

17.03.2013, 09:51. Просмотров 1584. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Импорт функции __stdcall из DLL (C++):

[Embarcadero] DLL импорт - C++
Здравствуйте, столкнулся с проблемой с импортом библиотеки. Скачал с GitHub библиотеку: https://github.com/SAMPProjects/Open-SAMP-API ...

Импорт из dll перегруженных операторов - C++
Здравствуйте, уважаемые программисты! По заданию необходимо при явном подключении dll импортировать класс. С обычными методами все...

Импорт значений из txt файла в dll - C++
Подскажите пожалуйста, как можно импортировать данные из txt файла в dll data,... #include &lt;windows.h&gt; #include &lt;math.h&gt; #include...

Импорт функции - C++
У меня есть библиотека в такой функцией #define THIS_EXPORT __declspec (dllexport) THIS_EXPORT void NET_NetConnect(char*...

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

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

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

В принципе, на ближайшее время мне хватит и этого, но все же хотелось бы знать, как запретить вставлять в имя функции информацию об аргументах.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.03.2013, 10:47 #4
Если dll чисто сишная, то и собирать ее надо как си, а не си++. Ну или можно еще использовать библиотеки импорта.
0
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
17.03.2013, 10:56  [ТС] #5
Сишная сборка ничего не дала. А что такое библиотеки импорта?
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,470
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
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.03.2013, 15:24 #7
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
Сишная сборка ничего не дала. А что такое библиотеки импорта?
Про библиотеки импорта например почитать можно тут.
Для сишной сборки вероятно надо убрать extern c, ну и убедиться, что действительно собирается как си. Т.е. экпортируемые имена не искажены. Обычно для этого хватает переименовать файлы проекта с *.cpp на *.c, ну и может быть сам проект сделать си вместо си++. Смотря в какой среде создается библиотека.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2013, 15:24
Привет! Вот еще темы с ответами:

Вызов функции с DLL - C++
Сразу говорю пишу программу как и *.dll в VisualStudio 2010. Суть: написал dll, вроде-бы все нормально скомпилировало и удачно создало...

Вызов функции из dll - C++
Привет всем! Пишу программу на Java. Спокойно, форум тот... Моя программа должна работать с устройством, висящим на LPT-порте. Для этого...

Экспорт функции DLL - C++
Вечер добрый. Работаю над проектом, в котором из DLL экспортируются функции для другого проекта. Столкнулся с проблемой, что сначала была...

Экспорт функции из dll - C++
Здравствуйте! Сейчас изучаю экспорты функций из dll-ок. Функцию без параметров удалось успешно экспортировать. А далее пробовал...


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

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

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