С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/22: Рейтинг темы: голосов - 22, средняя оценка - 4.77
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
1

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

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

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
9485 / 562 / 19
Регистрация: 12.04.2006
Сообщений: 11,671
Блог
17.03.2013, 09:51
Ответы с готовыми решениями:

Конфликт forward и stdcall в dll-библиотеке
Добрый день. Есть некая библиотека library S_dll; uses ...; {$R *.res} var ... ...

Передача структуры данных в DLL (stdcall)
Хочу передать данные следующей структуры в DLL: Поле1: Символьный тип, длинной 15 букв (Pole_1:...

Импорт функции из DLL
Суть программы она подгружает в себя DLL которая в свою очередь из полученных данных программой...

Импорт функции из dll
Доброго времени суток. Есть dll на с++ с некоторой функцией такого вида: extern &quot;C&quot;...

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

В принципе, на ближайшее время мне хватит и этого, но все же хотелось бы знать, как запретить вставлять в имя функции информацию об аргументах.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.03.2013, 10:47 4
Если dll чисто сишная, то и собирать ее надо как си, а не си++. Ну или можно еще использовать библиотеки импорта.
0
320 / 270 / 128
Регистрация: 24.05.2012
Сообщений: 629
17.03.2013, 10:56  [ТС] 5
Сишная сборка ничего не дала. А что такое библиотеки импорта?
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
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 и получается противоречие, в одном объявлении два разных соглашения о вызовах.

А здесь я набросал табличку в каком файле какое имя получается при разных вариантах компиляции:
Вложения
Тип файла: rar имена.rar (7.9 Кб, 23 просмотров)
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.03.2013, 15:24 7
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
Сишная сборка ничего не дала. А что такое библиотеки импорта?
Про библиотеки импорта например почитать можно тут.
Для сишной сборки вероятно надо убрать extern c, ну и убедиться, что действительно собирается как си. Т.е. экпортируемые имена не искажены. Обычно для этого хватает переименовать файлы проекта с *.cpp на *.c, ну и может быть сам проект сделать си вместо си++. Смотря в какой среде создается библиотека.
0
17.03.2013, 15:24
cpp_developer
Эксперт
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Блог
17.03.2013, 15:24
Помогаю со студенческими работами здесь

Сделать отладочную DLL (изменить cdecl на stdcall) для вызова из VB
Добрый день. А как обнаружить свой адрес при входе в функцию какой-либо DLL-ки ? А по русски...

Импорт функции из DLL написанной на С++
Есть dll файл написанный на С++ (Visual Studio) Работал с этой библиотекой в Autoit (скриптовый...

Импорт функции из DLL Ms Visual C++ 6.0
Не могу вызвать функции из Dll написаной на Ms VC++ 6. Возникает сообщение о том что функция не...

Импорт функции из DLL (предположительно, написана на С)
Уже не первый день пытаюсь воспользоваться хоть одной функцией из SDK ZKTeco, но пока безуспешно....


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Блоги программистов
Обновление сайта www.historian.b­y
Reglage 05.01.2025
Обещал подвести итоги 2024 года для сайта. Однако начну с того, что изменилось за неделю. Добавил краткий урок по последовательности действий при анализе вредоносных файлов и значительно улучшил урок. . .
Как использовать GraphQL в C# с HotChocolate
Programming 05.01.2025
GraphQL — это современный подход к разработке API, который позволяет клиентам запрашивать только те данные, которые им необходимы. Это делает взаимодействие с API более гибким и эффективным по. . .
Модель полного двоичного суматора с помощью логических операций (python)
AlexSky-coder 04.01.2025
def binSum(x:list, y:list): s=^y] p=x and y for i in range(1,len(x)): s. append((x^y)^p) p=(x and y)or(p and (x or y)) return s x=list() y=list()
Это мы не проходили, это нам не задавали...(аси­­хронный счётчик с управляющим сигналом задержки).
Hrethgir 04.01.2025
Асинхронный счётчик на сумматорах (шестиразрядный по числу диодов на плате, но наверное разрядов будет больше - восемь или шестнадцать, а диоды на старшие), так как триггеры прошли тестирование и. . .
Руководство по созданию бота для Телеграм на Python
IT_Exp 04.01.2025
Боты для Телеграм представляют собой автоматизированные программы, которые выполняют различные задачи, взаимодействуя с пользователями через интерфейс мессенджера. В данной статье мы рассмотрим,. . .
Применение компонентов PrimeVue в Vue.js 3 на TypeScript
BasicMan 04.01.2025
Введение в PrimeVue и настройка окружения PrimeVue представляет собой мощную библиотеку компонентов пользовательского интерфейса для Vue. js 3, которая предоставляет разработчикам богатый набор. . .
Как стать Senior developer
cpp_developer 04.01.2025
В современной индустрии разработки программного обеспечения позиция Senior Developer представляет собой не просто следующую ступень карьерной лестницы, а качественно новый уровень профессионального. . .
Что известно о дате выхода Windows 12 и чего от нее ждать
IT_Exp 04.01.2025
В мире технологий постоянно происходят изменения, и операционные системы не являются исключением. Windows 11, выпущенная в октябре 2021 года, принесла множество инноваций и улучшений, но. . .
Что новенького в .NET Core 9
Programming 04.01.2025
Обзор ключевых изменений в . NET Core 9 Платформа . NET Core продолжает активно развиваться, и версия 9 представляет собой значительный шаг вперед в эволюции этой технологии. Новый релиз. . .
Инструкция по установке python3.13.1 в Debian 12
AlexSky-coder 03.01.2025
sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget. . .
Затестил триггеры. архив проекта прилагаю с GOA файлами в настройках архиватора проектов.
Hrethgir 03.01.2025
В этот раз нет закольцованности, потому что от неё только глюки, как я понял, логика не вырезанная. Триггеры очень быстрые если верить измерениям с помощью анализатора от Gowin. Есть ещё регистры,. . .
Python в помощь DevOps
IT_Exp 03.01.2025
Причины использования Python в работе DevOps Python стал неотъемлемой частью мира DevOps, и это не случайно. Этот язык программирования обладает множеством преимуществ, которые делают его. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru