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

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

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

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

06.06.2012, 01:12. Просмотров 1574. Ответов 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 функции, тогда почему при статически поключенной длл все норм
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: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
551 / 504 / 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
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 а то может это много веса
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 02:04  [ТС] #21
Вот файлы только
Вложения
Тип файла: rar lab2 (cpp).rar (17.7 Кб, 5 просмотров)
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 02:05  [ТС] #22
-=ЮрА=-, не, там папки "ipch" много весят..
-=ЮрА=-
Заблокирован
Автор FAQ
06.06.2012, 02:07 #23
Serg046, 38 Мб я своим слабеньким инетом буду качать до нового пришествия, ещё раз повторюсь:
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
из проектов надо изъять папки Debug (Release если есть таковая)а также ncb файл он сам весит метров 10-15
Добавлено через 1 минуту
Цитата Сообщение от Serg046 Посмотреть сообщение
-=ЮрА=-, не, там папки "ipch" много весят..
ну тут ещё многое от того как создавал проект зависит, лан возьму файлы для анализа, постараюсь пооперативней отписаться
-=ЮрА=-
Заблокирован
Автор FAQ
06.06.2012, 02:32 #24
Serg046, проблемма была в отсутствии DllMain и как соедствии точки входа в ДЛЛ

Код DLL
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
26
// Serg046.cpp : Defines the entry point for the DLL application.
//
 
#include "stdafx.h"
#include <math.h>
 
#ifdef __cplusplus 
#define EXPORT extern "C" __declspec (dllexport) 
#else 
#define EXPORT __declspec (dllexport) 
#endif 
 
EXPORT double MyFunc(double X, double Y);
 
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    return TRUE;
}
 
EXPORT 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
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <windows.h>
using namespace std;
 
typedef double(*functionDll)( double, double );
functionDll myFunc;
 
int main(int argc, CHAR* argv[])
{
    double X, Y;
    HINSTANCE hDllInstance = LoadLibrary("Serg046.dll");
    if (hDllInstance == NULL)
        cout << "hDllInstance == NULL" << endl;
    else
    myFunc = (functionDll)GetProcAddress(hDllInstance, "MyFunc");
    if (myFunc == NULL)
        cout << "myFunc == NULL" << endl;
    else
    {
        cout << "Enter X: ";
        cin >> X;
        cout << "Enter Y: ";
        cin >> Y;
        cout << "Result = " << myFunc(X, Y) << endl;
    }
    if(hDllInstance)
        FreeLibrary(hDllInstance);
    system("pause");
    return 0;
}
Миниатюры
Динамическая загрузка библиотеки  
Вложения
Тип файла: rar Serg046_DLL_proj.rar (44.7 Кб, 7 просмотров)
Тип файла: rar Serg046.dll.rar (20.0 Кб, 5 просмотров)
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
06.06.2012, 02:49  [ТС] #25
Очень спасибо, моя первая детская проблема...

Добавлено через 18 секунд
Есть еще люди добрые)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2012, 02:49
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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