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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
17.03.2013, 09:51     Импорт функции __stdcall из DLL #1
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-функции импортируются нормально. Скажите, пожалуйста, в чем может быть ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2013, 09:51     Импорт функции __stdcall из DLL
Посмотрите здесь:

C++ DLL и Функции
Реализация __stdcall, __cdecl C++
__cdecl and __stdcall C++
Импорт из dll перегруженных операторов C++
C++ Импорт функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
17.03.2013, 10:05     Импорт функции __stdcall из DLL #2
Экспортируемые имена, доступные в готовой dll смотрели?
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
17.03.2013, 10:24  [ТС]     Импорт функции __stdcall из DLL #3
Спасибо за совет. Забавная картина: показано, что DLL экспортирует функцию foo@0, т. е. extern "C" как бы не действует. Если заменить в тестирующей программе "foo" на "foo@0", функция импортируется и вызывается.

В принципе, на ближайшее время мне хватит и этого, но все же хотелось бы знать, как запретить вставлять в имя функции информацию об аргументах.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
17.03.2013, 10:47     Импорт функции __stdcall из DLL #4
Если dll чисто сишная, то и собирать ее надо как си, а не си++. Ну или можно еще использовать библиотеки импорта.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
17.03.2013, 10:56  [ТС]     Импорт функции __stdcall из DLL #5
Сишная сборка ничего не дала. А что такое библиотеки импорта?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
17.03.2013, 11:11     Импорт функции __stdcall из DLL #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 и получается противоречие, в одном объявлении два разных соглашения о вызовах.

А здесь я набросал табличку в каком файле какое имя получается при разных вариантах компиляции:
Вложения
Тип файла: rar имена.rar (7.9 Кб, 18 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2013, 15:24     Импорт функции __stdcall из DLL
Еще ссылки по теме:

C++ error C2440: не конвертируется 'LRESULT (__stdcall General::* )(HWND,UINT,WPARAM,LPARAM)' to 'WNDPROC'
C++ Импорт значений из txt файла в dll
Чем отличается функция с __stdcall и без C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
17.03.2013, 15:24     Импорт функции __stdcall из DLL #7
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
Сишная сборка ничего не дала. А что такое библиотеки импорта?
Про библиотеки импорта например почитать можно тут.
Для сишной сборки вероятно надо убрать extern c, ну и убедиться, что действительно собирается как си. Т.е. экпортируемые имена не искажены. Обычно для этого хватает переименовать файлы проекта с *.cpp на *.c, ну и может быть сам проект сделать си вместо си++. Смотря в какой среде создается библиотека.
Yandex
Объявления
17.03.2013, 15:24     Импорт функции __stdcall из DLL
Ответ Создать тему
Опции темы

Текущее время: 00:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru