IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Dll., Bulder 6.0
сообщение
Сообщение #1


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Хочу создать файл Dll. Делаю так File->New->Other->Dll wizard
Там забиваю:

#include <windows.h>
extern "C" __declspec(dllexport)
double AddNumbers(double a, double b)
{
return a + b;
}



Помимо этого там ещё есть функция аналог main. Как правильно сохранить? Я жму сохранить и сам подписываю после точки расширение .dll... После чего открыть этот файл заново не получаеться.
Нам ещё сказали на занятиях что автоматически должен создаться файл .lib? И зачем он мне ещё предлогает сохранить проект какойто который я не создавал?...


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Что я только что сделал:

Открыл Билдер, File -> New -> Other -> Dynamic Link Library...

В диалоговом окне отключил все примочки VCL и Multi-Threading-а, сделал язык не С++, а С.

Открывается редактор:

#include <windows.h>

// Тут много букв - это пока неважно ...

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------



Добавляю, собственно, твою функцию... Получаю такой файл:

#include <windows.h>

#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT
#endif


double DLL_EXPORT AddNumbers(double a, double b)
{
return a + b;
}

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}

Сохраняю этот проект, причем файл сохраняется с расширением *.С... Билдим проект - получаем DLL вместо EXE...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Сделал так. Получил .dll.
Теперь в другом проекте.



#include <windows.h>
#include <stdio.h>
#define BUILD_DLL

//...

void __fastcall TForm1::Button1Click(TObject *Sender)
{
typedef int(*importFunction)(int, int);

importFunction addNumbers;
int result;

HINSTANCE hinstLib = LoadLibrary("Project2.dll");
addNumbers = (importFunction)GetProcAddress(hinstLib, "AddNumbers");

result = addNumbers(1, 2);
Edit1->Text=IntToStr(result);

FreeLibrary(hinstLib);
}



Что то не так. Файл Project2.dll лежит в тойже папке что и файлы этого проекта.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






DLL:


#include <windows.h>

double __declspec(dllexport) CALLBACK AddNumbers(double a, double b)
{
return a + b;
}

#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}



Проект:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
typedef double(CALLBACK *importFunction)(double, double);

importFunction addNumbers;
int result;

HINSTANCE hinstLib = LoadLibrary("Project2.dll");
addNumbers = (importFunction)GetProcAddress(hinstLib, "AddNumbers");

result = addNumbers(1, 2);
Edit1->Text=IntToStr(result);
FreeLibrary(hinstLib);
}

Все работает...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Спсибо разобрался... smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


А если необходимо создать .dll в котором описаны методы класса...это как сделать?...
Надо ли изменять или создавать файл .h или что то похожее?..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Ничего не надо ни изменять ни создавать заново. Один и тот же H-файл может использоваться и для DLL, и для использующей ее программы. Только в DLL класс должен описываться как

class __declspec (dllexport) MyClass {
...
};

а в программе - как
class __declspec (dllimport) MyClass {
...
};
(элементарно делается с использованием #ifdef)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Пишу в файле который хочу чтобы был .dll с описанием методов класса.

  
// #include "A.h"
// class __declspec(dllimport) A; Что то из этого нужно?

extern "C" __declspec(dllexport)
void A::setC(int anC)
{
C=anC;
};



Тогда в A.h (тот который должен относиться к .dll) что должно быть?


class __declspec(dllexport) A
{
public:
virtual void setC(int anC);
private:
int C;
};



Сообщение отредактировано: Fanat -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Используя LoadLibrary ты замучаешься работать с классом из DLL. Вот тут лежит пример, посмотри:
http://www.codeproject.com/dll/classesexportedusingLL.asp

Гораздо проще работать с LIB-файлом. Для этого случая:

Подключаемый к DLL-проекту header:
class __declspec(dllexport) MyClass {

public:
MyClass(int);
virtual void setConsumerID(int);
int getConsumerID();
private:
int ConsumerID;

};


В подключаемом к основному проекту заменить dllexport на dllimport
Собственно, код библиотеки:

#include <windows.h>
#include "MyClass.h"

MyClass::MyClass(int value) {
ConsumerID = value;
}
void MyClass::setConsumerID(int value) {
ConsumerID = value;
}
int MyClass::getConsumerID() {
return ConsumerID;
}


#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}



Использование (подключаем H-файл с описанием класса и LIB-файл через "Project -> AddToProject -> имя_файла.LIB"):
void __fastcall TForm1::Button1Click(TObject *Sender)
{

MyClass my(10);
ShowMessage(IntToStr(my.getConsumerID()));
}


Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Сделал как ты написал. Спасибо работает. Но является ли это динамической загрузкой.
Исходя из примера пишу HMODULE hMod = LoadLibrary ("ProjectDll.dll") выдаёт ошибку.
Как её загрузить?

Пишу так:


{
typedef int (*importFunction)();
importFunction getConsumer;
HMODULE hMod = LoadLibrary ("ProjectDll.dll");//<--Или .lib?
getConsumer = (importFunction)GetProcAddress(hMod, "getConsumer");
MyClass my(10);
ShowMessage(IntToStr(my.getConsumerID()));
}


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Вообще-то с LoadLibrary проблем быть не должно. У меня по крайней мере оно работает... А вот getConsumer - нулевой...

А это:
...
MyClass my(10);
...

работать не будет, потому как тело конструктора описано тоже в библиотеке, и надо брать адрес конструктора (и вызывать его по адресу), чтобы инициализировать объект.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Цитата(volvo @ 21.10.2007 18:29) *

работать не будет, потому как тело конструктора описано тоже в библиотеке, и надо брать адрес конструктора (и вызывать его по адресу), чтобы инициализировать объект.


А как конструктор описать и взять по адресу?
Пробовал через указатели сделать, но никак не получаеться wacko.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Вот тут есть довольно подробное объяснение процесса (и альтернативы тоже)...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Цитата(volvo @ 21.10.2007 19:50) *

Вот тут есть довольно подробное объяснение процесса (и альтернативы тоже)...


Во...спасибо...3ий вариант ето то что нужно...а с помощью чего можно открыть файл который разопхивируеться?.. Я так понимаю там пример...он бы мне сильно помог...=)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






blink.gif У меня третьим WinRar-ом свободно открылся...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Цитата(volvo @ 21.10.2007 20:53) *

blink.gif У меня третьим WinRar-ом свободно открылся...


Я в смысле тот файл что внутри лежит...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






А что там внутри у тебя не открывается? BPR - файлы проекта, открывай их и компилируй DLL-ку и саму программу...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Цитата(volvo @ 21.10.2007 21:22) *

А что там внутри у тебя не открывается? BPR - файлы проекта, открывай их и компилируй DLL-ку и саму программу...


Просто мне почему то пришлось дважды его разорхивировать и появились все файлы...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Всё!!! good.gif ...у меня получилось...спасибо огромное...только вопрос один:
откуда вообще в процессе работы программы берёться то что необходимо обратиться к файлу
КлассНаследник.cpp ведь ни один файл его не включает в себя?..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Гость






Цитата
ни один файл его не включает в себя?

FormTestDLL.H:

typedef IMyCls * (__declspec(dllimport) FCreate(int Size));
...
class TfrmTestDll : public TForm {
...
FCreate * Create; // <--- это что по-твоему?
...
};
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.09.2020 17:11
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name