Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
ВнизГде Win98 ищет dll ? Найти похожие ветки
← →
VID (2004-02-10 18:14) [0]В папке вместе с моей программой лежат две dll-ки: riched32.dll и riched20.dll
Они обе используются моей программной. В Win2k программа автоматически загружала именно эти две длл, т.е. те которые лежат в одной папке с прогой, ну а если их не было, то только тогда искала их в Winnt\System...
В 98 винде похоже всё наоборот! Т.е. сначала прога ищет dll-ки в System, а потом в своей папке. А это не есть гуд, т.к. dll которые идёт с моей прогой и лежат с ней в одной папке высшей версии (более новые) по сравнению с тем что лежат в папке System 98-ой винды.
Вариант с перезаписью библиотек, находящихся в папке System своими, не подходит, т.к. я не любитель переписывать "чужие" файлы... Вопрос: как надо настроить винду, или программу, что ваще надо сделать что бы в Windows 98 программа в первую очередь искала нужные ей dll в своей папке ?
← →
TUser (2004-02-10 18:33) [1]Прописывать путь при подключении библиотеки. Application.ExeFileName (или что-то вроде того) и ExtractFilePath.
← →
Владислав (2004-02-10 18:45) [2]> VID © (10.02.04 18:14)
Вообще, LoadLibrary + MSDN. Подробней некуда. И про 98 там тоже написано. И не только про 98. Прямо алгоритм поиска DLL есть.
← →
VID (2004-02-10 19:50) [3]Если объект TRichEdit лежит на Form1 (главная форма), то
будет ли верным вызов LoadLibrary в секции Initialization этого юнита(формы), или же LoadLibrary надо вызывать ещё раньще, в коде самого приложения (dpr) ?
← →
Владислав (2004-02-10 20:06) [4]Ну тут надо понимать одну вещь (И с некоторыми оговорками). Если библиотека уже загружена, то LoadLibrary нам уже мало чем поможет, кроме счетчика ссылок. Общий ответ, чем раньше, тем лучше. Остальное - конкретика.
← →
VID (2004-02-10 20:20) [5]Ну вот я и хочу понять... в каком момент программа загружает библиотеку автоматически ?
Логически, это должно происходить в момент инициилизации юнита, который в секции USES использует юнит, вообще это легко проверить написав тестовое приложение в котором Form1 использует одну библиотеку, а Form2 другую а потом просто пройтись дебаггером от первой строчки кода DPR и каждый раз пытаться удалять файл библиотеки из папки программы ( у меня Win2k ).
Если удаляется - значит ещё не нужна...
← →
VID (2004-02-10 20:25) [6]вот и получилось что например RichEd20.dll загружается ещё аж до Application.Initialize;
т.е. LoadLibrary надо вызывать до этой строчки файла DPR...
← →
VID (2004-02-10 20:27) [7]Var RichEd20:Cardinal = 0;
RichEd32:Cardinal = 0;
Procedure InitDlls;
begin
RichEd20 := LoadLibrary(Pchar(way+"riched20.dll"));
RichEd32 := LoadLibrary(Pchar(way+"riched32.dll"));
end;
Procedure FreeDlls;
begin
IF RichEd20 <> 0 then try FreeLibrary(RichEd20) except end;
IF RichEd32 <> 0 then try FreeLibrary(RichEd32) except end;
end;
begin
InitDlls;
Application.Initialize;
Application.Title := "";
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TCREForm, CREForm);
Application.Run;
FreeDlls;
end.
← →
VID (2004-02-10 20:29) [8]или может лучше
begin
InitDlls;
try
Application.Initialize;
Application.Title := "";
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TCREForm, CREForm);
Application.Run;
finally
FreeDlls;
end;
end.
?
← →
Владислав (2004-02-10 20:40) [9]Проблема чуть шире, конечно, но на это VID © (10.02.04 20:25) [6] не надейтесь. Тут может проверять версии установленных библиотек?..
← →
VID (2004-02-10 20:48) [10]а зачем ? объясни в чём собственно заключается проблема и почему мне не надеятся на шестой пост ?
← →
Владислав (2004-02-10 20:56) [11]На счет шестого поста... Тут за тебя "понадеятся" другие. Не знаю конкретной реализации, конечно, но тем не менее... Наверное, используешь и прочие модули...
Вообще, я в полемику ударился, видимо. В начале TUser © (10.02.04 18:33) [1] все было сказано... Не помогает?
← →
VID (2004-02-10 21:20) [12]я внимательно прочитал Help по LoadLibrary, и странно получается. там ясно написано что перво-наперво приложение ищет вызываемую DLL в папку откуда была запущена программа.
Тогда почему же когда я запукал прогу в вин98, и в папке проги были нужные ей библиотеки, програ всё равно подключала аналогичные библиотеки из папки SYSTEM ?
the function searches for the file in the following sequence:
1. The directory from which the application loaded.
2. The current directory.
3. Windows 95: The Windows system directory. Use the GetSystemDirectory function to get the path of this directory.
Из этой вырезки видно, что в папке System програ ищет dll аж в третью очередь (случай для win95/98). И это есть вопрос № 1.
А теперь ещё:
я в dpr-файле написал вот такой код:
{$R *.RES}
Var RichEd20:Cardinal = 0;
RichEd32:Cardinal = 0;
Procedure InitDlls;
begin
RichEd20 := LoadLibrary(Pchar(IncludeTrailingBackslash(ExtractFilePath(ParamStr(0))+"riched20.dll"));
RichEd32 := LoadLibrary(Pchar(IncludeTrailingBackslash(ExtractFilePath(ParamStr(0)))+"riched32.dll"));
end;
Procedure FreeDlls;
begin
{Точка1}IF RichEd20 <> 0 then try FreeLibrary(RichEd20) except end;
IF RichEd32 <> 0 then try FreeLibrary(RichEd32) except end;
end;
begin
{Точка 0}InitDlls;
try
Application.Initialize;
Application.Title := "";
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TCREForm, CREForm);
Application.Run;
finally
FreeDlls;
end;
end.
нужные две dLL-были в одной папке с прогой. Так вот что интересно, обе эти библиотеки были уже подключены (их невозможно было удалить), ещё до выполнения {точки 0}... по сути получается что вся канитель с InitDlls идёт коту под хвост...
по сути получается что LoadLibrary используемый в InitDll возвращает Handle уже подключённой библиотеки и просто инкрементирует счётчик обращений к библиотеки.
тогда я не понимаю, где ещё раньше надо ВРУЧНУЮ подключать dll ??? в главной форме исользуется RxRichEdit, richedit и тонна других юнитов...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.028 c