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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
NativeLand
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
#1

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

22.07.2013, 00:33. Просмотров 2055. Ответов 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 функции .. компилит но вылетает ошибка при выполнении исходника ...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2013, 00:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу вызвать функцию из .dll (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
23.07.2013, 13:00 #16
Зачем усложнять себе жизнь, если можно подключить import-library. Сомневаюсь что VS этого не умеет.
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
23.07.2013, 13:00 #17
ТС, оставь в .def файле просто
LIBRARY
EXPORTS
function
function2
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
23.07.2013, 13:02 #18
Если оставляешь .def-файл - тогда удаляй __declspec(dllexport) и наоборот.
http://msdn.microsoft.com/en-us/libr...=vs.80%29.aspx
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
23.07.2013, 13:02 #19
Цитата Сообщение от lazybiz Посмотреть сообщение
Сомневаюсь что VS этого не умеет.
А другие компиляторы, с другими правилами декорирования, поймут эти имена?
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
23.07.2013, 13:06 #20
Цитата Сообщение от Praktolock Посмотреть сообщение
А другие компиляторы, с другими правилами декорирования, поймут эти имена?
В самом начале статьи пример.
extern "C" совместно с __stdcall намного упрощают этот процесс.

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

Убрал из проекта .. ничего не поменялось...
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
23.07.2013, 13:13 #22
вот такой код:
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" никак не влияет на декорирование
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
23.07.2013, 13:19 #23
Цитата Сообщение от NativeLand Посмотреть сообщение
Убрал из проекта .. ничего не поменялось...
Такого не может быть. Сейчас специально VS скачаю...
NativeLand
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
23.07.2013, 13:24  [ТС] #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.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
23.07.2013, 13:26 #25
NativeLand, все правильно линкер создал. Подожди минут 15 ...
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
23.07.2013, 13:29 #26
Цитата Сообщение от NativeLand Посмотреть сообщение
Создал новый проект с этим же кодом без .def-файла
А с .def файлом? У меня вот всё собралось и имена есть в экпорте нормальные
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
23.07.2013, 13:29 #27
NativeLand, в папке с готовой .dll есть файл .lib (это import library), подключай его к своей программе, делай #include "mbdll.h" и все будет работать без LoadLibrary и GetProcAddress.
Т.е. просто обращаешься к функциям: c = function( 2, 3 );
NativeLand
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
23.07.2013, 13:36  [ТС] #28
Цитата Сообщение от 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
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
23.07.2013, 13:37 #29
Цитата Сообщение от NativeLand Посмотреть сообщение
Добавил .def файл такого содержимого:
Оставь такое содержимое:
C++
1
2
3
4
LIBRARY
EXPORTS
function
function2
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
23.07.2013, 13:38 #30
Зачем ты себе жизнь усложняешь этими .def-файлами? Намучаешься ты с ним.
Прикрепил готовый проект для DLL в формате VS2010
Вложения
Тип файла: zip dll.zip (63.8 Кб, 9 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2013, 13:38
Привет! Вот еще темы с ответами:

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

Как правильно вызвать функцию с указателем на другую функцию как параметр - C++
Вот вариант: double f(double x) { ... } double k(double (*f)(double), double y) { ...

Не получается вызвать функцию - C++
Есть функция &quot;void __fastcall TForm1::Image2MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)&quot; ...

Вызвать функцию заново - C++
Вот мой код, в котором двучлен раскладывается на квадратное уравнение. int Function(int x1, int x2){ if (x1&lt;0 &amp;&amp; x2&lt;0){ ...


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

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

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