Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.19;
Скачать: CL | DM;

Вниз

dll и ini файл   Найти похожие ветки 

 
ctudent ©   (2006-02-27 22:48) [0]

Народ! Как корректно вызвать процедуру на выполнение записи INI-файла из DLL. Может я неправильно что-то пишу?
Вот мой код

var
ProcHandle : THandle; //Хэндл через который мы будем обращаться к dll"ке
ImportProc : TProc;
inifile: TIniFile;
begin
ProcHandle:=LoadLibrary(".\bin\mglw.dll"); //загружаем dll"ку, если не указать расширение, то считается что это dll или exe файл
if ProcHandle>=32 then //если хэндл меньше 32, то значит произошла ошибка при загрузке dll"ки
begin
@ImportProc:=GetProcAddress(ProcHandle,"pred");//Получаем адрес процедуры
if @ImportProc<>nil then // Проверяем не произошла ли ошибка во время получения адреса процедуры
ImportProc(inifile.Create("ss")); //Выполняем саму процедуру
end;
FreeLibrary(ProcHandle); //


 
Гаврила ©   (2006-02-27 22:57) [1]

Ага, неправильно
во первых

> if ProcHandle>=32 then //если хэндл меньше 32, то
>значит произошла ошибка при загрузке dll"ки

Не < 32 а <> 0
If the function fails, the return value is NULL. To get extended error information, call GetLastError.

во-вторых

> ImportProc(inifile.Create("ss"));

Что это вообще такое? Поясни, по моему полная лажа :-)

В третьих, неплохо бы обрамить код в Try-Finally и сообщать об произошедщих ошибках вызываюшей стороне (пользователи или программе)


 
ctudent ©   (2006-02-27 23:12) [2]

if @ImportProc<>nil then

> во-вторых
>
> > ImportProc(inifile.Create("ss"));
>
> Что это вообще такое? Поясни, по моему полная лажа :-)
>
> В третьих, неплохо бы обрамить код в Try-Finally и сообщать
> об произошедщих ошибках вызываюшей стороне (пользователи
> или программе)

end;
FreeLibrary(ProcHandle); //
end;


 
ctudent ©   (2006-02-27 23:13) [3]

if @ImportProc<>nil then

> во-вторых
>
> > ImportProc(inifile.Create("ss"));
>
> Что это вообще такое? Поясни, по моему полная лажа :-)
>
> В третьих, неплохо бы обрамить код в Try-Finally и сообщать
> об произошедщих ошибках вызываюшей стороне (пользователи
> или программе)

end;
FreeLibrary(ProcHandle); //
end;

Согласен что  ImportProc(inifile.Create("ss")); полная лажа! Блин но как записать её правильно надо?


 
Гаврила ©   (2006-02-27 23:21) [4]


> Согласен что  ImportProc(inifile.Create("ss")); полная
> лажа! Блин но как записать её правильно надо?


Покажи, какой протопит функции ImportProc
и главное, объясни, что ты хочещь сделать


 
ctudent ©   (2006-02-27 23:39) [5]


>
> Покажи, какой протопит функции ImportProc
> и главное, объясни, что ты хочещь сделать

Блин, может я и мудак? Но записал, я следующим образом в процедуру DLL.

uses Edit, IniFile, .....
procedure pred(inifile:tinifile);export;
var
inifile: tinifile;
begin
IniFile:=TIniFile.Create(".\sved\services.ini");
IniFile.writeString("ssuda", "name_pred", Edit1.text);
IniFile.Free;
end;

Скорее всего я думаю, что вот тут-то как раз и неправильно? А хочу сделать я следующее -> Процедуру(или функцию) на запись ини файлов(файлов пользовательской настройки программы), запихать в dll и вызывать из DLL. В основном тексте программы понятно как это всё делается(в *.pas), а вот как в DLL поместить?


 
Гаврила ©   (2006-02-28 00:07) [6]

Поскольку твой пост сейчас удалят (за мат), копирую цитату полностью:

Но записал, я следующим образом в процедуру DLL.

uses Edit, IniFile, .....
procedure pred(inifile:tinifile);export;
var
inifile: tinifile;
begin
IniFile:=TIniFile.Create(".\sved\services.ini");
IniFile.writeString("ssuda", "name_pred", Edit1.text);
IniFile.Free;
end;

Скорее всего я думаю, что вот тут-то как раз и неправильно? А хочу сделать я следующее -> Процедуру(или функцию) на запись ини файлов(файлов пользовательской настройки программы), запихать в dll и вызывать из DLL. В основном тексте программы понятно как это всё делается(в *.pas), а вот как в DLL поместить?

Во первых
не надо передавать объекты по ссылке в DLL
procedure pred(inifile:tinifile);
работать это не будет (без сборки с ран тайм поакетами, но об этом позже).

Во Вторых
В процедуре вызова ты писал

> ImportProc(inifile.Create("ss"));

2.1 Создание экземпляра класса вызывается конструктором, который вызвывается от класса, а не от экземпляра
ImportProc(Tinifile.Create("ss"));
2.2 Даже если написать так - кто потом будет освобождать память?
Создан экземпляр, передан куда-то, память под него выделена, нужно бы потом освободить а указателя на вызывающей стороне нет (указатель получила принимающая сторона, но по хорошему должно выполняться требование: кто выделил тот и разрушает)
правильный вариант: (был бы правильным если бы не пункт 1 - не передавать объекты в DLL)
var Ini: TIniFile;  
Ini:=TIniFile.Create("ss"); //Выдлили память под объект
ImportProc(Ini);//вызвали внешнюю функцию, передали ей адрес только что созданного объекта. Адресное пространство у нас с DLL общее, так что по адресу (по ссылке) передавать в принципе можно, но осторожно(объекты передавать нельзя, и еще кое какие ограничения)
Ini.Free;// освободили память под объект
---
далее, в библиотеке: (полная чушь)

procedure pred(inifile:tinifile);export;
var
inifile: tinifile; //ЭТО не откомпилируется - совпадение имен параметра и локальной переменой
begin
IniFile:=TIniFile.Create(".\sved\services.ini");//БРЕД. нам передали параметром адрес объекта, а мы тут же в эту же переменную присваиваем новый адрес, который нам вернул TIniFile.Create. Таким образом мы потеряли ссылку на присланное. Зачем присылали?
IniFile.writeString("ssuda", "name_pred", Edit1.text);
IniFile.Free;
end;


 
tesseract ©   (2006-02-28 10:37) [7]

А вообще можно выяснить какой это вообще имеет смысл??????
Создавать DLL из оболочки  для ini-файлов.
Это возможно бы имело смысл, если пишешь свою библиотеку работы с
ini.  

Но так это программазм маразматикуз.

Если хочешь сэкономить память. Создай ещё класс  или форму. И инициализируй его по потребностям.


> IniFile.writeString("ssuda", "name_pred", Edit1.text);


А где в dll есть Edit1.text??? В функцию ты его не передаёшь.



Страницы: 1 вся ветка

Текущий архив: 2006.03.19;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.051 c
15-1141022634
Fenerik76
2006-02-27 09:43
2006.03.19
MP3 плеер Sony MPEG4 DivX + FM + диктофон купить


11-1122376775
RA
2005-07-26 15:19
2006.03.19
Для чего это "Can not change font ..."?


5-1126328242
Дельфин
2005-09-10 08:57
2006.03.19
Создание компонентов в Delphi 6 (полный перевод)


2-1141316644
Vitalik__
2006-03-02 19:24
2006.03.19
замена StringGrid а


3-1138286835
VitV
2006-01-26 17:47
2006.03.19
Access+Delphi