Evil_Smile |
Отправлено: 10.10.2006, 10:46 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 57
|
Господа подскажите как сделать DLL ку которая вызываясь динамически (OnCreate) читает необходимые значения из реестра а затем присваивает эти значения для компонентов формы, а на OnClose читает значения формы и записывает их в реестр вызов также происходит динамический.
только одна просьба овечайте pls подробно и желательно на примерах
я НЕ умею работать с DLL ками ВООБЩЕ
заранее благодарен
|
|
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
|
для кого понятно а для кого нет
из того что написал gvg мне понятно только пара слов LoadLibrary, и FreeLibrary (и те прочитал просто кде-то ), а все остальное ...
Отредактировано 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 с этим я уже разобрался и теперь столкнулся с другой проблемой
после загрузки библиотеки значение должно вывестись на 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; |
ниже я прицепил весь этот эксперимент
|
|
Valdemar |
Отправлено: 30.10.2006, 11:08 |
|
Мастер участка
Группа: Участник
Сообщений: 433
|
У вас написан вызов функции RValue(i). А почему вы думаете, что после этого значение i изменится? Чтобы вы не делали внутри функции с параметром, переданным в нее по значению, это никак не отразится на переменной, используемой в качестве параметра.
Напишите i=RValue(i); |
|
Evil_Smile |
Отправлено: 30.10.2006, 11:45 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 57
|
а так
он говорит
[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* мне непонятно
|
|
Evil_Smile |
Отправлено: 30.10.2006, 12:46 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 57
|
Всем спасибо
я разобрался вроде-бы почему была ошибка
[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;
|
опять же всем спасибо тему считаю закрытой пока...
|
|