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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 01:12     Динамическая загрузка библиотеки #1
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 функции, тогда почему при статически поключенной длл все норм
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
06.06.2012, 01:12     Динамическая загрузка библиотеки #2
Цитата Сообщение от Serg046 Посмотреть сообщение
Есть у кого готовый проект? Желательно vс++
Помогите с подключением dll к проекту
Тут попродвинутей
GetFileType и GetCosoleCursorInfo
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 01:17  [ТС]     Динамическая загрузка библиотеки #3
Да статически у меня все норм, динамически тоже, не используя math.h функции
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.06.2012, 01:23     Динамическая загрузка библиотеки #4
Цитата Сообщение от Serg046 Посмотреть сообщение
Все отлично, но (кинув в проект длл) загружая динамически выскакивают какие-то исключения.
что значит "какие-то"? они на то и выскакивают, чтобы их конкретно анализировали. описывай поподробнее.
-=ЮрА=-
Заблокирован
Автор FAQ
06.06.2012, 01:23     Динамическая загрузка библиотеки #5
Цитата Сообщение от Serg046 Посмотреть сообщение
не используя math.h функции
проекты по первой ссылке смотрел?
Она же ведёт на проект с собственными функциями и math.h там вообще не фигурирует
Далее если хотим именно LoadLibrary то заходим сюда http://www.cyberforum.ru/blogs/34326/blog244.html и смотрим об указателе на функцию
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.
-=ЮрА=-
Заблокирован
Автор 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
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 01:26  [ТС]     Динамическая загрузка библиотеки #8
Где-то читал про какой-то битый файли VS не из-за него?

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

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

Цитата Сообщение от Serg046 Посмотреть сообщение
L"lab2.dll"
и тут думаю с юникодом нелады
Цитата Сообщение от Serg046 Посмотреть сообщение
(hDllInstance, "MyFunc");
надо бы кодировку поменять. Короче мест где можно накосить столько что только скомпилировав свой проект у себя с конкретным кодом смогу что то конкретно сказать
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 секунд
Если можете помочь и есть время, я могу скинуть проект...
-=ЮрА=-
Заблокирован
Автор FAQ
06.06.2012, 01:33     Динамическая загрузка библиотеки #11
Serg046, просто поверь на слово пишу давно ну и по своему опыту уверен на 99,9%, что ошибка в каком то левом недочёте который не замечаешь (ну бывает и у меня такое смотришь на ошибку и вупор не понимаешь что она есть)

Добавлено через 1 минуту
Цитата Сообщение от Serg046 Посмотреть сообщение
Если можете помочь и есть время, я могу скинуть проект...
- через часов 10, я как раз допишу свой ночной фриланс и смогу полностью засесть на форуме, сейчас лишь поверхностно могу вникнуть в проблемму...
novi4ok
549 / 502 / 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 дело просто не доходит.
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; и возвращает же..
novi4ok
549 / 502 / 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. думаю, тоже вылетит.
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 01:49  [ТС]     Динамическая загрузка библиотеки #15
novi4ok, значение..
-=ЮрА=-
Заблокирован
Автор 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, выложи полностью код
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 01:50  [ТС]     Динамическая загрузка библиотеки #17
Щас я пересоберу, а то проекты не пустые 40 метров.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.06.2012, 01:57     Динамическая загрузка библиотеки #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- а я о чём толковал выше
при чем здесь ты?
-=ЮрА=-
Заблокирован
Автор FAQ
06.06.2012, 02:02     Динамическая загрузка библиотеки #19
novi4ok, а причём здесь ты?Я тебе грублю или мешаю?1 к 1-му повторяешь то что я написал выше ещё до твоего появления в теме, в чём проблемма то?!

Добавлено через 55 секунд
Цитата Сообщение от Serg046 Посмотреть сообщение
Щас я пересоберу, а то проекты не пустые 40 метров.
из них надо изъять папки Debug (Release если есть таковая)а также ncb файл он сам весит метров 10-15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2012, 02:03     Динамическая загрузка библиотеки
Еще ссылки по теме:

C++ Динамическая загрузка DLL
Вызов функции одной динамической библиотеки из другой динамической библиотеки C++

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

Или воспользуйтесь поиском по форуму:
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 02:03  [ТС]     Динамическая загрузка библиотеки #20
http://file.qip.ru/file/nunsSKCi/lab2.html ( 38.53 Мб )
Щас еще пустые выложу тупо файлы cpp а то может это много веса
Yandex
Объявления
06.06.2012, 02:03     Динамическая загрузка библиотеки
Ответ Создать тему
Опции темы

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