0 / 0 / 0
Регистрация: 03.07.2012
Сообщений: 56
1

Совмещение с DLL

26.07.2013, 09:53. Показов 971. Ответов 13
Метки нет (Все метки)

Здравствуйте!
Такая задача. У меня есть программка, которая проводит некоторые вычисления. Теперь, отдельно от этой программы мне нужно создать точно такую же, но в DLL. При этом открываться на выполнение должна первая, но вычисления должны проводиться во второй. То есть я ввожу значения, по которым проводятся вычисления, в программу, которую написала как обычно через проект в с++, затем эти данные каким-то образом должны передаться в DLL, там должны пройти вычисления, и в конце, уже готовый результат должен снова вернуться в первую программку, и та, в свою очередь, вывести результаты на экран. (Возможно, мне нужно просто написать программку в DLL, используя интерфейс первой программки (форму), но задача была поставлена именно так, как я описала выше).
Еще не приходилось ни разу сталкиваться с DLL, возможно кто-то понял, что мне нужно сделать и поможет советами, хотя бы с чего начать и как это можно реализовать.
Спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2013, 09:53
Ответы с готовыми решениями:

Ошибка об отсутствии MSVCP140D.dll, ucrtbased.dll, CONCRT140D.dll, VCRUNTIME140D.dll
Добрый день, товарищи. Возникла проблема. Делаю программу с использованием openCV 3.1 на Visual...

Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями?
Движок перевожу на платформу Win64 и нужно, чтобы разрядность ЕХЕ и DLL совпадали, а в интернете...

Затупил, скажите где взять libmysqld.dll, libmysqld50.dll, libmysqld51.dll
Вечер добрый, ставлю ZEOS на Delphi 7, и для нормальной работы нужны файлы libmysqld.dll,...

Сборка Qt: отучение Qt от mingw10.dll, libgcc_s_dw2-1.dll и других Qt***.dll
В связи с тем, что часто возникают одни и те же вопросы, а в нете копаться никто не любит привожу...

13
Практикантроп
4741 / 2647 / 512
Регистрация: 23.09.2011
Сообщений: 5,678
26.07.2013, 10:53 2
Вам из своей программки просто нужно будет вызывать функции из длл (все как и раньше: передаете функции параметры, получаете от нее результат). Для этого к своему приложению прикрепите библиотеку длл (файл lib, создастся при компиляции длл) и подключите h-файл длл (#include mydll.h). Вот, для примера, простой файл Unit2.cpp для создания длл__
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//---------------------------------------------------------------------------
#include "testdll.h"
#pragma hdrstop
//---------------------------------------------------------------------------
float GetVers()
{
   float ver = 4.22 ;
   return ver ;
}
//---------------------------------------------------------------------------
int GetVremja()
{
   int vre = 0x00000022;
   return vre;
}
//---------------------------------------------------------------------------
и хэдэр-файл для него__
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef __TESTDLL_H
#define __TESTDLL_H
 
#define TESTDLL_EXPORTS
 
#ifdef TESTDLL_EXPORTS
#define DLL_SPEC extern "C" __declspec(dllexport)
#else
#define DLL_SPEC extern "C" __declspec(dllimport)
#endif // TESTDLL_EXPORTS
 
DLL_SPEC float GetVers();
DLL_SPEC int GetVremja();
 
#endif // __TESTDLL_H
А вот так это будет выглядеть в программе:__
C++
1
2
3
4
5
6
7
void __fastcall TForm1::Button1Click(TObject *Sender)
{
      float ver = GetVers();
      int  vrem = GetVremja();
      Label2->Caption = IntToStr(vrem);
      Label3->Caption = FloatToStrF(ver,ffFixed,5,2);
}
Здесь все упрощено; функции длл возвращают константы, но это лишь для образца. Если это сделать получится, то дальше в длл зарисуете свои функции, которые до этого были в программе... .
1
0 / 0 / 0
Регистрация: 03.07.2012
Сообщений: 56
26.07.2013, 11:12  [ТС] 3
nick42, спасибо большое! Буду разбираться, пробовать.
Вопрос: 1 кусочек кода создан через dll, а 3-ий - это уже запись в отдельном проекте, с формой и т.п., правильно?
Т.е. я могу просто свою программку переделать, написав вместо вычислений обращения к функциям из dll (при этом, изначально, создав файл dll с хэдером), где записаны непосредственно сами формулы, да?
0
Практикантроп
4741 / 2647 / 512
Регистрация: 23.09.2011
Сообщений: 5,678
26.07.2013, 11:41 4
Да. Первым делом советую создать проект для длл и получить при его компиляции саму длл с либ - и 0 ошибок. Хорошо, если есть средство просмотра экспорта длл, - там вы должны увидеть что-то наподобие...
Совмещение с DLL
1
0 / 0 / 0
Регистрация: 03.07.2012
Сообщений: 56
26.07.2013, 11:43  [ТС] 5
nick42, еще раз спасибо!!
0
0 / 0 / 0
Регистрация: 03.07.2012
Сообщений: 56
29.07.2013, 13:23  [ТС] 6
nick42, а Вы не подскажете, каким образом мне ввод в эдиты инициализировать?
И записать это нужно же в основную программу, а затем как-то вызывать в длл?
0
Практикантроп
4741 / 2647 / 512
Регистрация: 23.09.2011
Сообщений: 5,678
29.07.2013, 13:50 7
Цитата Сообщение от grain Посмотреть сообщение
nick42, а Вы не подскажете, каким образом мне ввод в эдиты инициализировать?
И записать это нужно же в основную программу, а затем как-то вызывать в длл?
.. не советую. Возможно и при вызове длл форму строить, но вы же можете значения на эдиты в основной форме получить, а результат обработки пусть длл возвращает (так ведь было задумано?).
0
0 / 0 / 0
Регистрация: 03.07.2012
Сообщений: 56
29.07.2013, 14:04  [ТС] 8
nick42, да, именно так. Не совсем понимаю только, как это сделать. Не напишите поподробней?
А на счет формы - так у меня только одна форма - основная, в основном проекте. А должны быть еще?
0
Практикантроп
4741 / 2647 / 512
Регистрация: 23.09.2011
Сообщений: 5,678
29.07.2013, 14:55 9
Возможно я не правильно вас понял, поэтому лучше на примере.
В архиве два проекта: создание длл и простая форма с двумя эдитами и кнопкой. При нажатии на кнопку в длл посылается запрос с двумя параметрами (числа с плавающей точкой, считанные с эдитов). В ответ на этот запрос длл посылает рассчитанную сумму, которая будет помещена в лэйбл. Там все очень просто; если разберетесь, то легко сможете переместить свои функции из программы в длл, а ввод нужных данных организовать через эдиты.
Вложения
Тип файла: rar 26.RAR (27.2 Кб, 3 просмотров)
1
0 / 0 / 0
Регистрация: 03.07.2012
Сообщений: 56
29.07.2013, 14:59  [ТС] 10
nick42, о, спасибо огромное!
Надеюсь, разберусь
0
0 / 0 / 0
Регистрация: 03.07.2012
Сообщений: 56
08.08.2013, 13:21  [ТС] 11
nick42, добрый день)
Уже несколько дней не могу понять, в чем мои ошибки, по нескольку раз переписывала все. Так вот, Вы не подскажете, что не так, только не ругайтесь сильно, если совсем худо дело...
P.S: dll-ку подключила к основному проекту. Правда, статически, а динамическим связыванием, потому как со статикой тоже проблемы возникли -_-
Вот одна из функций (самая коротенькая ).
В dll:
C++
1
2
3
4
5
6
7
8
9
10
11
double Est(double fi0, double lyam0, double h0, double fi1, double lyam1, double h1)
{
        double dl, cosd, L;
        dl = lyam1 - lyam0;
        cosd=((sin(fi0*3.14/180))*(sin(fi1*3.14/180)))+((cos(fi0*3.14/180))*(cos(fi1*3.14/180))*(cos(dl*3.14/180)));
        const float Rz=6371;
 
        L=sqrt(((Rz+h0)*(Rz+h0))+((Rz+h1)*(Rz+h1))-(2*(Rz+h0)*(Rz+h1)*cosd));
 
        return L;
}
Вызов в основной:
C++
1
2
3
double estim = Est(StrToFloat(Edit1->Text),StrToFloat(Edit2->Text),StrToFloat(Edit3->Text),StrToFloat(Edit4->Text),StrToFloat(Edit5->Text),StrToFloat(Edit6->Text));
        Label7->Caption="Расстояние = "+FloatToStr(RoundTo(estim, -2))+" км";
        Label7->Visible=true;
В хэдере основной:
C++
1
2
typedef double (*EST)(double,double,double,double,double,double);
        EST Est;
И в хэдере для dll:
C++
1
__declspec( dllexport ) double Est(double fi0, double lyam0, double h0, double fi1, double lyam1, double h1);
0
Практикантроп
4741 / 2647 / 512
Регистрация: 23.09.2011
Сообщений: 5,678
08.08.2013, 14:22 12
Во вложении (архив 44) - два проекта (по Вашему коду); у длл всего одна функция (самая коротенькая). Программа что-то там выдает в лэйбл, - я надеюсь: то, что ей задали. Изменений я сделал пару, ну, может, три - не помню уже. Так что в основном у Вас все верно. Найдите эти "три отличия" и попробуйте в таком же тоне описать остальные функции (конечно, если с этой "коротенькой" все получилось...).
Вложения
Тип файла: rar 44.RAR (184.9 Кб, 3 просмотров)
1
0 / 0 / 0
Регистрация: 03.07.2012
Сообщений: 56
08.08.2013, 14:30  [ТС] 13
nick42, спасибо еще раз! Буду разбираться
0
Практикантроп
4741 / 2647 / 512
Регистрация: 23.09.2011
Сообщений: 5,678
08.08.2013, 14:39 14
Возможно, будут проблемы с файлом testdll.bpr. Тогда подмените его этим (во вложении), я его "подчистил".
Вложения
Тип файла: rar testdll.rar (1.3 Кб, 1 просмотров)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2013, 14:39
Помогаю со студенческими работами здесь

Совмещение ПР
Подскажите как сделать чтобы у сайта без WWW был такой же ПР , что и у сайта с WWW? Сайт ...

Совмещение шейдеров
Допустим, у меня есть шейдер для отрисовки анимированной модели. Я хочу написать еще один шейдер, в...

Совмещение локалок
В общем такая проблема. Есть сервер, он же центральный компьютер, который подключается к интернету...

Совмещение языков
С праздником программистов всех! У меня вопрос насчет плаформы .NET. Я с другом хотим написать...

Совмещение графиков
Здравствуйте, уважаемые Специалисты! Помогите пожалуйста с совмещением двух графиков различного...

Совмещение bitmap
Вопрос задачи: нужно на одной поверхности совместить два изображения. Использую TBitmap. 2 штуки....


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

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

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