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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
NativeLand
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
22.07.2013, 00:33     Не могу вызвать функцию из .dll #1
Добрый день ... Полазил по форумам и гайдам ....
Пишу такой вот 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 функции .. компилит но вылетает ошибка при выполнении исходника ...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NativeLand
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
23.07.2013, 13:12  [ТС]     Не могу вызвать функцию из .dll #21
Цитата Сообщение от lazybiz Посмотреть сообщение
Проблема в .def-файле, там имена функций другие. Я, честно говоря, вообще не знаю зачем он нужен, я при компиляции .dll никогда его не использовал. Попробуй его вообще убрать.
Делал по гайду ... Там написано, что линкер же коверкает имена функций и переменных, а .def-файл "переназначает" их имена... Т.е. у одной и той же функции, насколько я понял, "2 имени обращения" .. тот, что линкер сделал .. и тот, что прописан в .def-файле для данного имени (определяемого линкером)...

Убрал из проекта .. ничего не поменялось...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
23.07.2013, 13:13     Не могу вызвать функцию из .dll #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
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
23.07.2013, 13:19     Не могу вызвать функцию из .dll #23
Цитата Сообщение от NativeLand Посмотреть сообщение
Убрал из проекта .. ничего не поменялось...
Такого не может быть. Сейчас специально VS скачаю...
NativeLand
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
23.07.2013, 13:24  [ТС]     Не могу вызвать функцию из .dll #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
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
23.07.2013, 13:26     Не могу вызвать функцию из .dll #25
NativeLand, все правильно линкер создал. Подожди минут 15 ...
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
23.07.2013, 13:29     Не могу вызвать функцию из .dll #26
Цитата Сообщение от NativeLand Посмотреть сообщение
Создал новый проект с этим же кодом без .def-файла
А с .def файлом? У меня вот всё собралось и имена есть в экпорте нормальные
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
23.07.2013, 13:29     Не могу вызвать функцию из .dll #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  [ТС]     Не могу вызвать функцию из .dll #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
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
23.07.2013, 13:37     Не могу вызвать функцию из .dll #29
Цитата Сообщение от NativeLand Посмотреть сообщение
Добавил .def файл такого содержимого:
Оставь такое содержимое:
C++
1
2
3
4
LIBRARY
EXPORTS
function
function2
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
23.07.2013, 13:38     Не могу вызвать функцию из .dll #30
Зачем ты себе жизнь усложняешь этими .def-файлами? Намучаешься ты с ним.
Прикрепил готовый проект для DLL в формате VS2010
Вложения
Тип файла: zip dll.zip (63.8 Кб, 9 просмотров)
NativeLand
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
23.07.2013, 13:46  [ТС]     Не могу вызвать функцию из .dll #31
Цитата Сообщение от 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 файла
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
23.07.2013, 13:48     Не могу вызвать функцию из .dll #32
Цитата Сообщение от 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 файла
Так компилится чтоли? У тебя сейчас ошибка где вылазиет, а то я запутался уже
NativeLand
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
23.07.2013, 13:55  [ТС]     Не могу вызвать функцию из .dll #33
Цитата Сообщение от 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++" и деф-файлом ...
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
23.07.2013, 13:57     Не могу вызвать функцию из .dll #34
значит у тебя по разному обьявлены экспортируемые функции и указатели в на них в экзешнике

Добавлено через 28 секунд
приведи код mbdll.h из длл и код экзешника
NativeLand
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
23.07.2013, 14:03  [ТС]     Не могу вызвать функцию из .dll #35
Код .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
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
23.07.2013, 14:05     Не могу вызвать функцию из .dll #36
попробуй так обьявить указатели:
C++
1
2
 typedef int (__stdcall*Add1)(int a, int b);
 typedef double (__stdcall*Add2)(double a, double b);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2013, 14:11     Не могу вызвать функцию из .dll
Еще ссылки по теме:

Не могу вызвать функцию из dll С++ в С# в системе Win 7 64bit, MSVS 2008 C++
C++ Как вызвать функцию, описанную в DLL через Custom Action в wix?
Как правильно вызвать функцию с указателем на другую функцию как параметр C++

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

Или воспользуйтесь поиском по форуму:
NativeLand
0 / 0 / 0
Регистрация: 27.12.2010
Сообщений: 46
23.07.2013, 14:11  [ТС]     Не могу вызвать функцию из .dll #37
Цитата Сообщение от Praktolock Посмотреть сообщение
попробуй так обьявить указатели:
C++
1
2
 typedef int (__stdcall*Add1)(int a, int b);
 typedef double (__stdcall*Add2)(double a, double b);
И еще раз спасибо, проблема решена!
Yandex
Объявления
23.07.2013, 14:11     Не могу вызвать функцию из .dll
Ответ Создать тему
Опции темы

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