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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
#1

Динамическая загрузка библиотеки - C++

06.06.2012, 01:12. Просмотров 1587. Ответов 24
Метки нет (Все метки)

lab2.dll
C++
1
2
3
4
5
6
7
#include <windows.h>
#include <math.h>
 
extern "C"  __declspec(dllexport) double MyFunc(double X, double Y)
{
    return -log(fabs(X * X / (Y - 1))) / log(2.0);
}
Загружаю ее статически, кинув длл и либ в проект
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"
#include <iostream>
 
#pragma comment(lib, "lab2.lib") 
extern "C" _declspec(dllexport) double MyFunc( double X, double Y);
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    double X, Y;
    cout << "Введите X: ";
    cin >> X;
    cout << "Введите Y: ";
    cin >> Y;
    cout << "Результат = " << MyFunc(X, Y) << endl;
    system("pause");
    return 0;
}
Все отлично, но (кинув в проект длл) загружая динамически выскакивают какие-то исключения.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <Windows.h>
using namespace std;
 
int main(int argc, CHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    double X, Y;
    cout << "Введите X: ";
    cin >> X;
    cout << "Введите Y: ";
    cin >> Y;
    HINSTANCE hDllInstance = LoadLibraryEx(L"lab2.dll", 0, DONT_RESOLVE_DLL_REFERENCES );
    typedef double(*functionDll)( double, double );
    functionDll myFunc = (functionDll)GetProcAddress(hDllInstance, "MyFunc");
    cout << "Результат = " << myFunc(X, Y) << endl;
    FreeLibrary(hDllInstance);
    system("pause");
    return 0;
}
Что не так то?

Добавлено через 6 часов 44 минуты
Есть у кого готовый проект? Желательно vс++

Добавлено через 13 минут
Кстати все отлично работает если моя dll будет такой
C++
1
2
3
4
5
6
7
#include <windows.h>
#include <math.h>
 
extern "C"  __declspec(dllexport) double MyFunc(double X, double Y)
{
    return 5;
}
Ощущение что не отрабатывают math.h функции, тогда почему при статически поключенной длл все норм
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2012, 01:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамическая загрузка библиотеки (C++):

создание библиотеки dll и динамическая загрузка - C++
Есть какие-нибудь статьи, чтобы изучить, как создать и загрузить библиотеку? А то на сайте msdn.microsoft дают такой код, который с...

Динамическая загрузка DLL - C++
Доброго времени суток! Создал dll с добавление класса, как учили: http://msdn.microsoft.com/ru-ru/library/ms235636.aspx. Далее,...

Динамическая загрузка и освобождение памяти для двумерного массива - C++
Всем добрый день:victory: У меня возник небольшой вопрос , и надеюсь что отзывчивые форумчане 8-) помогут мне с ним разобраться. ...

Загрузка библиотеки и использованием ее функций - C++
Добрый день уважаемые форумчане. Как всегда не нашел подходящего раздела, поэтому пишу тут. Есть turbo c++ версии 3.0. и есть...

про библиотеки в VS C++ (какие библиотеки нужны для функций 'cout' и 'cin') - C++
какие библиотеки нужны для функций 'cout' и 'cin' ???

Как включить библиотеки в исполняемый файл, чтобы не приходилось ставить библиотеки (Eclipse) - C++
Как включить библиотеки в конечный EXE как это сделано в bilder, чтобы не приходилось ставить библиотеки.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
-=ЮрА=-
Заблокирован
Автор FAQ
06.06.2012, 01:12 #2
Цитата Сообщение от Serg046 Посмотреть сообщение
Есть у кого готовый проект? Желательно vс++
Помогите с подключением dll к проекту
Тут попродвинутей
GetFileType и GetCosoleCursorInfo
1
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 01:17  [ТС] #3
Да статически у меня все норм, динамически тоже, не используя math.h функции
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.06.2012, 01:23 #4
Цитата Сообщение от Serg046 Посмотреть сообщение
Все отлично, но (кинув в проект длл) загружая динамически выскакивают какие-то исключения.
что значит "какие-то"? они на то и выскакивают, чтобы их конкретно анализировали. описывай поподробнее.
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.06.2012, 01:23 #5
Цитата Сообщение от Serg046 Посмотреть сообщение
не используя math.h функции
проекты по первой ссылке смотрел?
Она же ведёт на проект с собственными функциями и math.h там вообще не фигурирует
Далее если хотим именно LoadLibrary то заходим сюда http://www.cyberforum.ru/blogs/34326/blog244.html и смотрим об указателе на функцию
0
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 01:25  [ТС] #6
C++
1
2
3
4
5
extern "C"  __declspec(dllexport) double MyFunc(double X, double Y)
{
    double res = -log(fabs(X * X / (Y - 1))) / log(2.0); 
    return 5;
}
Такая длл тоже исключение дает. Щас скину его.

Добавлено через 41 секунду
Необработанное исключение в "0x775815de" в "Dynamic2.exe": 0xC0000005: Access violation.
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.06.2012, 01:25 #7
Цитата Сообщение от Serg046 Посмотреть сообщение
Ощущение что не отрабатывают math.h функции
- а ты смотрел ОДЗ своих функций

Цитата Сообщение от Serg046 Посмотреть сообщение
-log(fabs(X * X / (Y - 1))) / log(2.0);
у тебя вполне может быть логорифм нуля X = 0 или деление на ноль к примеру Y - 1 при Y = 1
0
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 01:26  [ТС] #8
Где-то читал про какой-то битый файли VS не из-за него?

Добавлено через 30 секунд
-=ЮрА=-, почему тогда с этими же параметрами статически все норм
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.06.2012, 01:30 #9
Serg046, мой совет попробуй сначала проект своего клиента с директ функциями прописанными в нём - выловишь для начала косяки связанные со значениями переменных, а уж потом "зашивай" функции в ДЛЛ

Добавлено через 2 минуты
Цитата Сообщение от Serg046 Посмотреть сообщение
=ЮрА=-, почему тогда с этими же параметрами статически все норм
- я допустим вообще не вижу норм не норм поцепи проекты или их код для анализа

Цитата Сообщение от Serg046 Посмотреть сообщение
L"lab2.dll"
и тут думаю с юникодом нелады
Цитата Сообщение от Serg046 Посмотреть сообщение
(hDllInstance, "MyFunc");
надо бы кодировку поменять. Короче мест где можно накосить столько что только скомпилировав свой проект у себя с конкретным кодом смогу что то конкретно сказать
0
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 01:31  [ТС] #10
-=ЮрА=-, да а что ловить.
Такая длл тоже самое выкидывает
C++
1
2
3
4
5
6
7
8
#include <windows.h>
#include <math.h>
 
extern "C"  __declspec(dllexport) double MyFunc(double X, double Y)
{
    //double res = -log(fabs(X * X / (Y - 1))) / log(2.0); 
    return fabs(-5.0);
}
Добавлено через 47 секунд
Если можете помочь и есть время, я могу скинуть проект...
0
-=ЮрА=-
Заблокирован
Автор FAQ
06.06.2012, 01:33 #11
Serg046, просто поверь на слово пишу давно ну и по своему опыту уверен на 99,9%, что ошибка в каком то левом недочёте который не замечаешь (ну бывает и у меня такое смотришь на ошибку и вупор не понимаешь что она есть)

Добавлено через 1 минуту
Цитата Сообщение от Serg046 Посмотреть сообщение
Если можете помочь и есть время, я могу скинуть проект...
- через часов 10, я как раз допишу свой ночной фриланс и смогу полностью засесть на форуме, сейчас лишь поверхностно могу вникнуть в проблемму...
1
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.06.2012, 01:39 #12
функции LoadLibraryEx и GetProcAddress возвращают значения. почему ты не проверяешь, что вернулось? напиши так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
HINSTANCE hDllInstance = LoadLibraryEx(L"lab2.dll", 0, DONT_RESOLVE_DLL_REFERENCES );
 
if (hDllInstance == NULL){
   cout << "hDllInstance == NULL" << << endl;
}
 
    typedef double(*functionDll)( double, double );
    functionDll myFunc = (functionDll)GetProcAddress(hDllInstance, "MyFunc");
 
if (myFunc == NULL){
   cout << "myFunc == NULL" << << endl;
}
думаю, до math дело просто не доходит.
1
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 01:43  [ТС] #13
novi4ok,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
HINSTANCE hDllInstance = LoadLibraryEx(L"lab2.dll", 0, DONT_RESOLVE_DLL_REFERENCES );
 
    if (hDllInstance == NULL){
        cout << "hDllInstance == NULL" << endl;
    }
 
    typedef double(*functionDll)( double, double );
    functionDll myFunc = (functionDll)GetProcAddress(hDllInstance, "MyFunc");
 
    if (myFunc == NULL)
    {
        cout << "myFunc == NULL" << endl;
    }
    else
    {
    cout << "Результат = " << myFunc(X, Y) << endl;
    }
Тоже самое исключение

Добавлено через 38 секунд
Не пойму почему без math тогда работает, ведь пишу тупо return 5; и возвращает же..
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.06.2012, 01:47 #14
извини, не обратил внимания, что return 5 работает.

тогда почему не попробовать воткнуть эту строчку прямо в main?

#include <math.h>
double dbl = -log(fabs(X * X / (Y - 1))) / log(2.0);

получим значение или исключение?
естественно, искользовать значения икса и игрека, при которых бросается исключение.

еще один эксперимент проведи: верни не просто 5, а, скажем, x+y. думаю, тоже вылетит.
0
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 01:49  [ТС] #15
novi4ok, значение..
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2012, 01:49
Привет! Вот еще темы с ответами:

Вызов функции одной динамической библиотеки из другой динамической библиотеки - C++
Добрый день! Помогите пожалуйста разобраться со следующим вопросом. Возможно ли из одной библиотеки передать параметры для...

динамическая матрица в си++ - C++
Ребят, задача такова Дана квадратная матрица A(N,N). Получить из неё массив B, если N - четно, и B, если N - нечетно, элементами...

Динамическая память - C++
Как создать массив A через динамическую память ???

Динамическая структура - C++
Составить программу, которая содержит динамическую информацию о наличии автобусов в автобусном парке. Сведения о каждом автобусе...


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

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

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