Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46

Не могу вызвать функцию из .dll

22.07.2013, 00:33. Показов 6930. Ответов 36
Метки нет (Все метки)

Добрый день ... Полазил по форумам и гайдам ....
Пишу такой вот header:
C++
1
2
extern "C++" __declspec(dllexport) int function (int,int);
extern "C++" __declspec(dllexport) double function2(double,double);
Далее непосредственно сам .cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
#include "mbdll.h"
 
int function(int a, int b)
{
    return a*b;
}
 
double function2(double a,double b)
{
    return a/b;
}
И потом .def файлик:
C++
1
2
3
4
LIBRARY
EXPORTS
function = ?function@@YAHHH@Z PRIVATE
function2 = ?function2@@YANNN@Z PRIVATE

Теперь сам проект из которого явным способом пытаюсь вызвать функции (.dll добавил в проект через Shift+Alt+A):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "stdafx.h"
#include "windows.h"
#include <iostream>
 
int _tmain(int argc, _TCHAR* argv[])
{
    typedef int (*Add1)(int a, int b);
    typedef double (*Add2)(double a, double b);
 
    HMODULE hmod = LoadLibrary((LPCWSTR)"mbdll.dll");
    
    Add1 fun1= (Add1) GetProcAddress(hmod, "function");
    Add2 fun2= (Add2) GetProcAddress(hmod, "function2");
    if (fun1 || fun2)
    {
        std::cout<<fun1(3,3)<<std::endl;
        std::cout<<fun2(3,3)<<std::endl;
    }
    else
        std::cout<<"Cannot get function address\n";
 
    FreeLibrary( hmod );
    system("PAUSE");
    return 0;
}
И мне выдает "Cannot get function address" ... Если просто вызываю без if функции .. компилит но вылетает ошибка при выполнении исходника ...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.07.2013, 00:33
Ответы с готовыми решениями:

Не могу вызвать функцию из dll С++ в С# в системе Win 7 64bit, MSVS 2008
Здравствуйте! Уже два дня не могу вызвать функцию из dll C++ в программе, написанная в C#. Программа пишется в MS VS 2008 Win 7 64bit. ...

Вызвать функцию из dll с неопределённым числом параметров
Нужно вызвать из dll функцию с неопределённым числом параметров. пока что работаю с таким вызовом char res; char (*dll) (char* ...);...

Как из DLL вызвать функцию, находящуюся в exe?
Плз. скажите, как из DLL вызвать функцию, находящуюся в exe'шнике. Плз.! Плз.! Плз.!

36
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
23.07.2013, 13:12  [ТС]
Цитата Сообщение от lazybiz Посмотреть сообщение
Проблема в .def-файле, там имена функций другие. Я, честно говоря, вообще не знаю зачем он нужен, я при компиляции .dll никогда его не использовал. Попробуй его вообще убрать.
Делал по гайду ... Там написано, что линкер же коверкает имена функций и переменных, а .def-файл "переназначает" их имена... Т.е. у одной и той же функции, насколько я понял, "2 имени обращения" .. тот, что линкер сделал .. и тот, что прописан в .def-файле для данного имени (определяемого линкером)...

Убрал из проекта .. ничего не поменялось...
0
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
23.07.2013, 13:13
вот такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifdef __cplusplus
extern "C" 
{
#endif
 
#include "mbdll.h"
 
int  __stdcall function (int a,int b)
{
    return a*b;
}
 
double __stdcall function2(double a,double b)
{
    return a/b;
}
 
#ifdef __cplusplus
}
#endif
вот такое содержимое таблицы эксопрта:
1 0 00011177 _function2@16 = @ILT+370(_function2@16)
2 1 0001101E _function@8 = @ILT+25(_function@8)
Вопросы?

Добавлено через 46 секунд
stdcall и extern "c" никак не влияет на декорирование
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
23.07.2013, 13:19
Цитата Сообщение от NativeLand Посмотреть сообщение
Убрал из проекта .. ничего не поменялось...
Такого не может быть. Сейчас специально VS скачаю...
0
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
23.07.2013, 13:24  [ТС]
Создал новый проект с этим же кодом без .def-файла .. теперь .dll собралась, а вот адрес не могу "взять" .. поскольку имена функций линкер сделал такими: _function@8 , _function2@16....
При вызове функций _function и _function2 .. не берет адрес .. а при _function@8 , _function2@16 начинает вылетать ошибка при передачи аргументов в функцию во время выполнения:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
23.07.2013, 13:26
NativeLand, все правильно линкер создал. Подожди минут 15 ...
0
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
23.07.2013, 13:29
Цитата Сообщение от NativeLand Посмотреть сообщение
Создал новый проект с этим же кодом без .def-файла
А с .def файлом? У меня вот всё собралось и имена есть в экпорте нормальные
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
23.07.2013, 13:29
NativeLand, в папке с готовой .dll есть файл .lib (это import library), подключай его к своей программе, делай #include "mbdll.h" и все будет работать без LoadLibrary и GetProcAddress.
Т.е. просто обращаешься к функциям: c = function( 2, 3 );
0
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
23.07.2013, 13:36  [ТС]
Цитата Сообщение от Praktolock Посмотреть сообщение
А с .def файлом? У меня вот всё собралось и имена есть в экпорте нормальные
Добавил .def файл такого содержимого:
C++
1
2
3
4
LIBRARY
EXPORTS
function = _function@8
function2 = _function2@16
Ошибка при сборке : LINK : fatal error LNK1168: cannot open C:\Users\emm\Desktop\dll2\Debug\dll2.dll for writing
0
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
23.07.2013, 13:37
Цитата Сообщение от NativeLand Посмотреть сообщение
Добавил .def файл такого содержимого:
Оставь такое содержимое:
C++
1
2
3
4
LIBRARY
EXPORTS
function
function2
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
23.07.2013, 13:38
Зачем ты себе жизнь усложняешь этими .def-файлами? Намучаешься ты с ним.
Прикрепил готовый проект для DLL в формате VS2010
Вложения
Тип файла: zip dll.zip (63.8 Кб, 11 просмотров)
1
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
23.07.2013, 13:46  [ТС]
Цитата Сообщение от lazybiz Посмотреть сообщение
NativeLand, в папке с готовой .dll есть файл .lib (это import library), подключай его к своей программе, делай #include "mbdll.h" и все будет работать без LoadLibrary и GetProcAddress.
Т.е. просто обращаешься к функциям: c = function( 2, 3 );
Так я уже давно подключил .. и при extern "C++" "начальный вариант" сборки библиотек одну .dll подключил....
Сей час просто пытаюсь понять как собрать уже библиотеку с extern "C" .. а потом как ее подключить имея лишь 1 .dll (ведь не факт, что я буду пользоваться библиотеками с .lib, header в дальнейшем .. пока есть время пытаюсь разобраться и научиться)...

Добавлено через 7 минут
Цитата Сообщение от Praktolock Посмотреть сообщение
Оставь такое содержимое:
C++
1
2
3
4
LIBRARY
EXPORTS
function
function2
Оставил... Собрал новую .dll ... Подключил ее к проекту .. та же самая ошибка, что и без .def файла
0
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
23.07.2013, 13:48
Цитата Сообщение от NativeLand Посмотреть сообщение
Ошибка при сборке : LINK : fatal error LNK1168: cannot open C:\Users\emm\Desktop\dll2\Debug\dll2.dll for writing
Вот мой вариант:
mbdll.h:
C++
1
2
3
4
5
extern "C"
{
__declspec(dllexport) int __stdcall function (int,int);
__declspec(dllexport) double __stdcall function2(double,double);
}
mbdll.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "mbdll.h"
extern "C"
{
 int  __stdcall function (int a,int b)
 {
    return a*b;
 };
 
 double __stdcall function2(double a,double b)
 {
    return a/b;
 };
}
ololo.def:
C++
1
2
3
4
LIBRARY
EXPORTS
function
function2
всё компилится ок. pumpbin /exports:
C++
1
2
3
4
ordinal hint RVA      name
 
2    0 0001101E function = @ILT+25(_function@8)
1    1 00011177 function2 = @ILT+370(_function2@16)
Добавлено через 1 минуту
Цитата Сообщение от NativeLand Посмотреть сообщение
Оставил... Собрал новую .dll ... Подключил ее к проекту .. та же самая ошибка, что и без .def файла
Так компилится чтоли? У тебя сейчас ошибка где вылазиет, а то я запутался уже
0
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
23.07.2013, 13:55  [ТС]
Цитата Сообщение от Praktolock Посмотреть сообщение
Вот мой вариант:
Так компилится чтоли? У тебя сейчас ошибка где вылазиет, а то я запутался уже
Извиняюсь, что запутал ...
.dll собралась ...
В экспорте видит функции: function and function2 нормально
Подключаю в другой проект .dll .. берет адрес нормально теперь .. компилит норм .. но при "исполнении" .exe вылетает следующая ошибка:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

Та же ошибка вылетает .. если собрать .dll и без .def файла .... Что удивительно .. исчезает, если подключить библиотеку с exterc "C++" и деф-файлом ...
0
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
23.07.2013, 13:57
значит у тебя по разному обьявлены экспортируемые функции и указатели в на них в экзешнике

Добавлено через 28 секунд
приведи код mbdll.h из длл и код экзешника
0
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
23.07.2013, 14:03  [ТС]
Код .exe
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "stdafx.h"
#include "windows.h"
#include <iostream>
 
int _tmain(int argc, _TCHAR* argv[])
{
    typedef int (*Add1)(int a, int b);
    typedef double (*Add2)(double a, double b);
 
    HMODULE hmod = LoadLibrary((LPCWSTR) L"dll3.dll" ); 
    
    Add1 fun1= (Add1) GetProcAddress(hmod, "function");
    Add2 fun2= (Add2) GetProcAddress(hmod, "function2");
    if (fun1 || fun2)
    {
        std::cout<<fun1(3,3)<<std::endl;
        std::cout<<fun2(3,3)<<std::endl;
    }
    else
        std::cout<<"Cannot get function address\n";
 
    FreeLibrary( hmod );
    system("PAUSE");
    return 0;
}
Код header'a .dll файла:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef mbdll
#define mbdll
 
#ifdef __cplusplus
extern "C" 
{
#endif
 
#define __exp __declspec(dllexport)
 
int __exp __stdcall function (int,int);
double __exp __stdcall function2(double,double);
 
#ifdef __cplusplus
}
#endif
 
#endif //mbdll
0
 Аватар для Praktolock
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
23.07.2013, 14:05
попробуй так обьявить указатели:
C++
1
2
 typedef int (__stdcall*Add1)(int a, int b);
 typedef double (__stdcall*Add2)(double a, double b);
1
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
23.07.2013, 14:11  [ТС]
Цитата Сообщение от Praktolock Посмотреть сообщение
попробуй так обьявить указатели:
C++
1
2
 typedef int (__stdcall*Add1)(int a, int b);
 typedef double (__stdcall*Add2)(double a, double b);
И еще раз спасибо, проблема решена!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.07.2013, 14:11

Не могу вызвать функцию
код функцииtemplate &lt;class T&gt;//Прямой void Tree&lt;T&gt;::streight(Node *root) { if(!root) return; // printf(&quot;%d....

Как вызвать функцию, описанную в DLL через Custom Action в wix?
Не нашел подходящего раздела для вопроса, поэтому решил сделать здесь, тк DLL написана на c++! Вот сама DLL:#include &lt;stdio.h&gt; ...

Не могу вызвать функцию через указатель
Есть функция void matrixsqr(int **a, int N, int M) как ее вызвать через указатель на функцию Добавлено через 18 минут Неужели никто...

Могу ли я поменять какую-нибудь функцию в готовой dll-ке?
Прошу прощенья за тупой вопрос! Но! Могу ли я поменять какую-нибудь функцию в готовой dll-ке? Если могу, то с помощью чего? Заранее...

Вызвать функцию из dll
V8.1 В справке по 1С есть инфа, как подключить dll-ку. Но вот только не написано как вызвать оттуда функцию. Мне нужно что-то вроде...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru