21 / 21 / 6
Регистрация: 07.01.2010
Сообщений: 376
1

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

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

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.06.2012, 01:12
Ответы с готовыми решениями:

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

Динамическая загрузка библиотеки и вызов метода
Есть DLL библиотека на C# которая динамически подключается в проект и происходит вызов метода из...

Производительность библиотеки - динамическая/статистическая (Debug/Release)
Всем привет! Собираю библиотеку для работы с числами для другого своего проекта, вопрос знатокам: ...

Динамическая загрузка DLL
Доброго времени суток! Создал dll с добавление класса, как учили:...

24
Заблокирован
Автор FAQ
06.06.2012, 01:12 2
Цитата Сообщение от Serg046 Посмотреть сообщение
Есть у кого готовый проект? Желательно vс++
Помогите с подключением dll к проекту
Тут попродвинутей
GetFileType и GetCosoleCursorInfo
1
21 / 21 / 6
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 01:17  [ТС] 3
Да статически у меня все норм, динамически тоже, не используя math.h функции
0
556 / 510 / 25
Регистрация: 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 то заходим сюда https://www.cyberforum.ru/blogs/34326/blog244.html и смотрим об указателе на функцию
0
21 / 21 / 6
Регистрация: 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
21 / 21 / 6
Регистрация: 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
21 / 21 / 6
Регистрация: 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
556 / 510 / 25
Регистрация: 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
21 / 21 / 6
Регистрация: 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
556 / 510 / 25
Регистрация: 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
21 / 21 / 6
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 01:49  [ТС] 15
novi4ok, значение..
0
Заблокирован
Автор FAQ
06.06.2012, 01:49 16
Цитата Сообщение от novi4ok Посмотреть сообщение
#include <math.h>
double dbl = -log(fabs(X * X / (Y - 1))) / log(2.0);
получим значение или исключение?
- а я о чём толковал выше
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Serg046, мой совет попробуй сначала проект своего клиента с директ функциями прописанными в нём - выловишь для начала косяки связанные со значениями переменных, а уж потом "зашивай" функции в ДЛЛ
Добавлено через 21 секунду
Serg046, выложи полностью код
0
21 / 21 / 6
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 01:50  [ТС] 17
Щас я пересоберу, а то проекты не пустые 40 метров.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.06.2012, 01:57 18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- а я о чём толковал выше
при чем здесь ты?
0
Заблокирован
Автор FAQ
06.06.2012, 02:02 19
novi4ok, а причём здесь ты?Я тебе грублю или мешаю?1 к 1-му повторяешь то что я написал выше ещё до твоего появления в теме, в чём проблемма то?!

Добавлено через 55 секунд
Цитата Сообщение от Serg046 Посмотреть сообщение
Щас я пересоберу, а то проекты не пустые 40 метров.
из них надо изъять папки Debug (Release если есть таковая)а также ncb файл он сам весит метров 10-15
0
21 / 21 / 6
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 02:03  [ТС] 20
http://file.qip.ru/file/nunsSKCi/lab2.html ( 38.53 Мб )
Щас еще пустые выложу тупо файлы cpp а то может это много веса
0
06.06.2012, 02:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.06.2012, 02:03
Помогаю со студенческими работами здесь

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

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

Динамическая загрузка DLL
Я написал библиотеку и использую ее в консольном приложении подключая динамически. В конфигурации...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru