Текущий архив: 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