C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
DLL и компоненты
Evil_Smile
  Отправлено: 10.10.2006, 10:46


Дежурный стрелочник

Группа: Участник
Сообщений: 57



Господа подскажите как сделать DLL ку которая вызываясь динамически (OnCreate) читает необходимые значения из реестра а затем присваивает эти значения для компонентов формы, а на OnClose читает значения формы и записывает их в реестр вызов также происходит динамический.
только одна просьба овечайте pls подробно и желательно на примерах smile.gif
я НЕ умею работать с DLL ками ВООБЩЕ sad.gif

заранее благодарен
gvg
Отправлено: 10.10.2006, 13:40


Машинист паровоза

Группа: Участник
Сообщений: 222



Здесь два вопроса, никак не связанные друг с другом. Первый — создание длл (как таковых). Второй — работа с реестром. По второму — смотри TRegistry
olegenty
Отправлено: 10.10.2006, 14:26


Ветеран

Группа: Модератор
Сообщений: 2412



File->New->Other->DLL Wizard

ну и далее текст самой DLL.

динамическая загрузка DLL — LoadLibrary/GetProcAddress/FreeLibrary
Evil_Smile
Отправлено: 10.10.2006, 14:57


Дежурный стрелочник

Группа: Участник
Сообщений: 57



с реестром я работать относительно умею

меня интересует как DLL ке взять значения о расположении окон, выбраных Radiobutton и тд и как их присвоить для тех же копонентов
gvg
Отправлено: 10.10.2006, 15:32


Машинист паровоза

Группа: Участник
Сообщений: 222



А, ну понятно — длл вне формы. Ну так и что, создаешь длл с функциями чтения и записи. Работа с этими функциями — как с обычными. Только сначала грузишь длл ( LoadLibrary), сохраняешь адреса нужных функций (GetProcAddress). Когда длл не нужна — выгружаешь длл (FreeLibrary)
Все.
Evil_Smile
Отправлено: 10.10.2006, 16:10


Дежурный стрелочник

Группа: Участник
Сообщений: 57



для кого понятно а для кого нет sad.gif

из того что написал gvg мне понятно только пара слов sad.gif LoadLibrary, и FreeLibrary (и те прочитал просто кде-то sad.gif ), а все остальное ...

Отредактировано Evil_Smile — 11.10.2006, 01:13
gvg
Отправлено: 10.10.2006, 17:00


Машинист паровоза

Группа: Участник
Сообщений: 222



Мда... А без длл сделаешь? Так с длл точно также. Только в хэлп относительно длл глянуть...
Evil_Smile
Отправлено: 10.10.2006, 17:37


Дежурный стрелочник

Группа: Участник
Сообщений: 57



без dll`ки я это уже делал
и теперь с целью уменьшения объёма строк exe`шника (и увеличения опыта) я хочу закинуть некоторые вещи в dll`ку
Evil_Smile
Отправлено: 14.10.2006, 13:17


Дежурный стрелочник

Группа: Участник
Сообщений: 57



я всё-таки решился на эксперементы с DLL

Господа подскажите где ошибка

вызаваю DLL
CODE

dllInstance = LoadLibrary("DLL_pro.dll");
if (dllInstance)
// получение указателя на функцию
C_D = (FType *)GetProcAddress(dllInstance, "Write");
else
ShowMessage("Не удалось загрузить 'MyDLL.dll'");

h — файл
CODE

       void __fastcall Button2Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
private:
// User declarations
// Объявление типа указателя на DLL
HINSTANCE dllInstance;
// Объявление типа указателя на функцию
typedef int (__import * FType(int*));
FType * C_D;
public:  // User declarations
__fastcall TForm1(TComponent* Owner);


cpp — файл
CODE

if (C_D)
{
C_D(rb); переменная типа int
       }
else
{
ShowMessage("Функция 'Code_Dec' из 'MyDLL.dll' недоступна");
       }


а вот сама DLL
cpp — файл
CODE

int Write(int *i)
{
TRegistry *reg = new TRegistry();
reg->RootKey = HKEY_CURRENT_USER;
reg->OpenKey("Software\fdll", true);
reg->WriteString("str", IntToStr(i));
reg->CloseKey();
return true;
}


по идеи она должна записать значение rb в реестр

Отредактировано Evil_Smile — 14.10.2006, 22:19
Evil_Smile
Отправлено: 29.10.2006, 09:22


Дежурный стрелочник

Группа: Участник
Сообщений: 57



В процесе создания Dll-ки я наткнулся на такую проблему
почему на запись значения вот так
CODE

int * ValuesW(int w)//может принимать только два значения (0 и 1)
{
int wr;
wr = w;
...
regw->WriteInteger("value", wr);
...
w = wr;
//return wr;
}

компилятор говорит
"[C++ Warning] unitdll.cpp(23): W8070 Function should return a value"
а если вот так
CODE

.....
regw->CloseKey();
delete regw;
w = wr;
return wr;

то он говорит
"[C++ Error] unitdll.cpp(22): E2034 Cannot convert 'int' to 'int *'"


На чтение вот таким образом
CODE

int * ValuesR(int r)//может принимать только два значения (0 и 1)
{
int rr;
...
rr = regr->ReadInteger("value");
...
r = rr;
}

компилятор говорит
"[C++ Warning] unitdll.cpp(35): W8070 Function should return a value"


однако если добавить return rr или return r то он говорит
"[C++ Error] unitdll.cpp(22): E2034 Cannot convert 'int' to 'int *'"

Подскажите в чём ошибка PLS
Valdemar
Отправлено: 30.10.2006, 08:54


Мастер участка

Группа: Участник
Сообщений: 433



Evil_Smile, так у вас функция возвращает указатель на int, сами ведь написали:
int * ValuesW(int w)
Поэтому и получаете ошибки когда вообще ничего не возвращаете из функции, или пытаетесь вернуть int вместо указателя на int.
Evil_Smile
Отправлено: 30.10.2006, 09:09


Дежурный стрелочник

Группа: Участник
Сообщений: 57



Спасибо Valdemar smile.gif с этим я уже разобрался и теперь столкнулся с другой проблемой wink.gif
после загрузки библиотеки значение должно вывестись на Label и оно выводится даже но вместо того которое в реестре "1" выводится "0"
может ошибка здесь а может и нет
CODE

dllInstance = LoadLibrary("mydll.dll");
if (dllInstance)
 {
       RValue = (rType *)GetProcAddress(dllInstance, "_ValuesR");
       }
else
 {
       ShowMessage("Cannot Load \"mydll.dll\"");
       }
if (RValue)
 {
       RValue(i);
       }
else
 {
       ShowMessage("Read");
       }
Label1->Caption = i;

ниже я прицепил весь этот эксперимент


User Attached Image Скачать файл
Form_VS_DLL.zip


Valdemar
Отправлено: 30.10.2006, 11:08


Мастер участка

Группа: Участник
Сообщений: 433



У вас написан вызов функции RValue(i). А почему вы думаете, что после этого значение i изменится? Чтобы вы не делали внутри функции с параметром, переданным в нее по значению, это никак не отразится на переменной, используемой в качестве параметра.
Напишите i=RValue(i);
Evil_Smile
Отправлено: 30.10.2006, 11:45


Дежурный стрелочник

Группа: Участник
Сообщений: 57



а так
CODE

i = RValue(i);

он говорит
[C++ Error] UnitForm2.cpp(70): E2034 Cannot convert 'int *' to 'int'
olegenty
Отправлено: 30.10.2006, 12:08


Ветеран

Группа: Модератор
Сообщений: 2412



RTFM
а ты понимаешь, что он говорит-то???
Evil_Smile
Отправлено: 30.10.2006, 12:28


Дежурный стрелочник

Группа: Участник
Сообщений: 57



если не изменяет память то
int это число, а int* указатель на целое число только причем тут int* мне непонятно sad.gif
Evil_Smile
Отправлено: 30.10.2006, 12:46


Дежурный стрелочник

Группа: Участник
Сообщений: 57



Всем спасибо smile.gif
я разобрался вроде-бы почему была ошибка
[C++ Error] UnitForm2.cpp(70): E2034 Cannot convert 'int *' to 'int'
крылась она здесь
CODE

typedef int (__export * rType (int i));
rType * RValue;

в то время как надо
CODE

typedef int (__export rType (int i));
rType * RValue;

опять же всем спасибо smile.gif тему считаю закрытой пока...

Вернуться в Вопросы программирования в C++Builder