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

Вниз

Где 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
14-80297
Alone
2004-02-03 11:26
2004.02.25
Глюки Windows не являются ошибками


4-80352
Ivan K.
2003-12-18 07:43
2004.02.25
Как получить названия окон?


1-79943
афвуд
2004-02-09 16:00
2004.02.25
Уникальный ключ.


3-79553
Lucky[ELF]
2004-01-27 20:22
2004.02.25
Созание фильтра


11-79685
Dimaxx
2003-06-03 00:06
2004.02.25
Как использовать битмапы у пунктов в MainMenu?